django框架中的form组件的用法

form组件的使用

先导入:

from django.forms import Form
from django.forms import fields
from django.forms import widgets
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError

在创建类,继承Form(定义input框的验证规则)

class Loginform(Form):
    username=fields.CharField(error_messages={"required":"用户名不能为空"},
    widget=widgets.TextInput(attrs={"class":"form-control"}))
    password=fields.CharField(error_messages={"required":"密码不能为空"},
    widget=widgets.PasswordInput(attrs={"class":"form-control"}))

    def clean_username(self):
        # ...
        user = self.cleaned_data['username']
        is_exsit = models.Userinfo.objects.filter(username=user).count()
        if not is_exsit:
            raise ValidationError('用户名不存在')
        return user

在实例化创建对象,将对象返回给render函数进行渲染

   if request.method=="GET":
        form=Loginform()
        return render(request,"login.html",{"form":form})

模板渲染

用户名:{{ form.username }}{{ form.errors.username.0 }}
密码:{{ form.password}}{{ form.errors.password.0 }}

用户输入信息提交后进行验证

 form=Loginform(data=request.POST)
    if form.is_valid(): #是否验证成功
        user=models.Userinfo.objects.filter(**form.cleaned_data).first() #通过验证则进行数据库比对
        if user:
            request.session[settings.WXP]={"name":user.username}
            return redirect("/index/")
        form.add_error('password', ValidationError('用户名或密码错误'))
        return render(request,"login.html",{"form":form})
    else:
        return render(request,"login.html",{"form":form}) #没通过验证则返回错误信息

解决数据源无法实时更新的方法

重写__init__方法(推荐使用)
class ClassForm(Form):
    caption = fields.CharField(error_messages={'required':'班级名称不能为空'})            
    headmaster_id = fields.ChoiceField(choices=[])
    def __init__(self,*args,**kwargs):
    super().__init__(*args,**kwargs)
    self.fields['headmaster_id'].choices = models.UserInfo.objects.filter(ut_id=2).values_list('id','username')
方法一
#使用ModelChoiceField创建字段
from django.forms.models import ModelChoiceField
class ClassForm(Form):
    caption = fields.CharField(error_messages={'required':'班级名称不能为空'})        
    headmaster_id = ModelChoiceField(queryset=models.UserInfo.objects.filter(ut_id=2))
方法二