django modelForm

modelform:根据模型字段定义相对应的表单字段

代码示例:

#forms.py
from django import forms
from django.core.exceptions import ValidationError
from django.contrib.auth.models import User


 

# modelForm
class LoginModelForm(forms.ModelForm):
    class Meta:
        # 1 定义模型 将模型表单类与某个模型绑定
        model = User
        #         2 定义验证字段,选取某些字段生成表单,__all__代表所有
        fields = (
            "username", "password",
        )
        #         3 labels 为每个字段设置label标签
        labels = {
            "username": "输入用户名",
            "password": "请输入密码"
        }
        #         4 自定义错误信息,设置表单错误信息,"__all__" 所有字段错误信息,如果单个字段则可以如: error_messages = {
        #             "username": {"required": "请输入内容", "invalid": "请检查输入的内容"}
        #         }
        error_messages = {
            "__all__": {"required": "请输入内容", "invalid": "请检查输入的内容"}
        }
        #         5  定义widgets,设置表单字段对应html元素属性,dict形式

        widgets = {
            "username": forms.TextInput(
                attrs={"class": "layui-input", "placeholder": "请输入", "lay-verify": "required|phone", "id": "username"}
            ),
            "password": forms.PasswordInput(
                attrs={"class": "layui-input", "placeholder": "请输入", "lay-verify": "required|password",
                       "id": "password"}
            )

        }

        # 自定义数据清洗
        def clean_username(self):
            if len(self.cleaned_data['username']) == 11:
                return self.cleaned_data['username']
            else:
                raise ValidationError("username is error")
#view.py
from django.forms import ModelForm
from django.contrib.auth.models import User

class LoginMView(View):
    TEMPLATE = "login.html"

    def get(self, request, *args, **kwargs):
        title = "用户登录"
        classContent = "logins"
        infos = LoginModelForm()
        return render(request, self.TEMPLATE, locals())

    def post(self, request, *args, **kwargs):
        title = "用户登录"
        classContent = "logins"
        infos = LoginModelForm(data=request.POST)
        data = infos.data
        username = data.get("username")
        password = data.get("password")
        if User.objects.filter(username=username):
            user = authenticate(username=username, password=password)
            if user:
                login(request, user)
                return redirect(reverse("shopper:shopper"))
        else:
            state = "注册成功"
            d = dict(username=username, password=password, is_staff=1, is_active=1)
            user = User.objects.create_user(**d)
            user.save()
        return render(request, self.TEMPLATE, locals())

属性:

instance:将模型查询的数据传入模型表单,作为表单的初始数据

model:必须属性用于绑定model对象

fields:可选属性,表示哪些模型字段可以转换为,默认为None代表所有的模型字段

exclude:与fields相反

labels:可选属性,设置html控件的label属性

widgets:可选属性,设置表单字段参数widget

localized_fields:可选属性,将模型字段设为本地化的表单字段,一般用于日期类型的模型字段

field_classes:   可选属性,将模型字段重新定义,默认情况下模型字段跟表达字段遵循django内置转化规则

help_texts:可选属性,设置表单字段的help_text

error_messages: 可选属性,设置表单字段的error_messages

方法:

clean(): 重写父类baseform的clean()方法,并将_validate_unique设置为True

validate_unique():验证表单数据是否存在异常

save():将模型表单数据保存在数据库里,如果参数commit为true就直接保存在数据库,否则生成数据实例对象。

模型字段和表单字段django内置转化规则:

AutoField:不能转化为表单字段

BigAutoField:不能转为表单字段

BigIntegerField    IntegerField,最小-9223372036854775808,最大9223372036854775807.
BooleanField    BooleanField
CharField    CharField,同样的最大长度限制。如果model设置了null=True,Form将使用empty_value
CommaSeparatedIntegerField    CharField
DateField    DateField
DateTimeField    DateTimeField
DecimalField    DecimalField
EmailField    EmailField
FileField    FileField
FilePathField    FilePathField
FloatField    FloatField
ForeignKey    ModelChoiceField
ImageField    ImageField
IntegerField    IntegerField
IPAddressField    IPAddressField
GenericIPAddressField    GenericIPAddressField
ManyToManyField    ModelMultipleChoiceField
NullBooleanField    NullBooleanField
PositiveIntegerField    IntegerField
PositiveSmallIntegerField    IntegerField
SlugField    SlugField
SmallIntegerField    IntegerField
TextField    CharField,并带有widget=forms.Textarea参数
TimeField    TimeField
URLField    URLField
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值