栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Python

模型表单验证,入库 以及空间命名

Python 更新时间:发布时间: 百科书网 趣学号

文章目录
  • 模型表单
  • 表单验证
  • 表单存库:
    • 单表入库
      • 实现表单存库后能够修改数据:
    • 多表联合入库,
  • 命名空间:

模型表单
  1. 准备:

创建并配置应用目录

  1. 功能:

只要在模型表单中创建出来的字段, 那么在form.py中就不需要创建了,只需要指定 模型就可以了

示例:

1.定义模型

------------------>在models文件中

from django.db import models

# Create your models here.
class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

    def __str__(self):
        return self.name

class Entry(models.Model):
    headline = models.CharField(max_length=100)
    body_text = models.TextField()
    author = models.ManyToManyField(Author)   #   和上方的Author关联
    def __str__(self):

2.模型表单的使用-------->form.py文件

from django import forms  #导入
from 应用目录名.models import Author  #导入class 模型类.

class AuthorForm(forms.ModelForm):
    class Meta:                         #直接把自带的Meta拿过来,
      																
        model = Author             #关联模型
        # fields = ['要校验的字段1',"要校验的字段2"]  #靶想要校验的字段拿出来, 进行校验
      
      #全部验证,__all__, 除了字段name之外,其他自己输入的字段都要验证.
       fields = '__all__'
        exclude = ['name'] 

注:.模型字段和表单字段的对应关系

点击进入文档

  1. 模型表单的两次迁移(form表单的迁移)

    注:

    *一个模型( 一个class )在迁移完成之后,在数据库中就会生成一张表.

    表单验证

    在views文件

from django.shortcuts import render

# Create your views here.
from django.views import View
from 应用目录名.form import AuthorForm   #导入表单

class Hello(View):
    def get(self,request):
        form = AuthorForm()           #表单实例化
        return (request,'the_15/hello.html',{"form":form , "post":True})

​ 对应的``url`文件

from 应用目录名.views import Hello
from django.urls import path
urlpatterns = [

    path('hello/',Hello.as_view,name = 'form_name'),
]

​ 4.2 在form.py文件中

from django import forms
from the_15.models import Author

class AuthorForm(forms.ModelForm):
    class Meta:                         #直接把自带的Meta拿过来
    														#模型表单和表单区别就在于,模型表单中校验不用在定义字段了
        model = Author             #关联模型
        # fields = ['要校验的字段1',"要校验的字段2"]  #靶想要校验的字段拿出来, 进行校验
        fields = '__all__'
        exclude = ['name']
      
      #数据校验  
    def clean_email(self):
        email = self.cleaned_data.get('email','')
        if email.startswith('a'):
            raise forms.ValidationError('您以a开头了')
        return email

     
    
# Meta就是省略了人们写字段的这个步骤.
#对于不需要数据校验的表单,可以使用模板表单工厂函数,例如:
M2MForm = modelform_factory(Entry,fields='__all__')  #Entry就是本例中要继承的模型.


      
      

这是html:


{{ form }}
{% if post %}
我是post
{% endif %}
表单存库: 单表入库

适用于没有关联其他表单,只是独自一张表的存入方法:

在views.py文件中--->表单实例化.save()

from django.shortcuts import render

# Create your views here.
from django.views import View
from the_15.form import AuthorForm

class Hello(View):
    def get(self,request):                               
        form = AuthorForm()   
        return render(request,'应用目录名/hello.html',{"form":form})

    def post(self,request):                            
        form = AuthorForm(request.POST)
        if form.is_valid():
            form.save()              #表单存库,  其他和上面一样
                           #因为form是表单实例化拿到的数据,所以直接.save() 就可以了.
实现表单存库后能够修改数据:
#还是上段代码
class Hello(View):
    def get(self,request):                               
        form = AuthorForm()   
        return render(request,'应用目录名/hello.html',{"form":form})

    def post(self,request):   
        #这里是获取 id 为1 的数据 ,前提已经有了数据.  如果没有数据,可能报错
        author = 模型的class名.objects.get(id= 1)   #可能因为这行代码报错
        
        form = AuthorForm(request.POST, instance= author) #instance具有更新的能力. 达到修改的目的
        if form.is_valid():
            form.save()              #表单存库,  其他和上面一样
                           #因为form是表单实例化拿到的数据,所以直接.save() 就可以了.
多表联合入库,

适用于ManyToMany,相互关联的表, 多张表

class M2M(View) :
    def get(self,request):            #提交前的请求
        form = M2MForm()
        return render(request , "模板应用目录名/m2m.html",{"form":form})
    
    def post(self,request):           #提交后的请求
        form = M2MForm(request.POST)     #表单实例化
        if form.is_valid():
            entry = form.save(commit=False) #先拿到数据但是不提交
            entry.headline = '固定'         #定义的models.py文件中有headline字段.
            entry.save()                   
            form.save_m2m()                  #真正的提交
            
            
   #这样写的好处是, 前台在写headline的时候,无论输入啥,存入表里面的都会是 '固定'

Django文档

按住 ctrl +F 搜索m2m 看到详情.

命名空间:

当应用目录的path 使用 name 关键字的时候,为了更加准确找到html,可以这样作:

就是防止表单的url名字重复.

  1. 在**应用目录的urls.py**中
app_name = "应用目录名"  
  1. 在**html**中
转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1033729.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号