ModelFron组件

 1. 基本使用

from django import forms


class User(forms.ModelForm):
    class Meta:
        model = models.user  # 对应的Model中的类
        fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段

1.2 字段注册的三种方式 

  # 字段注册三种方式
        fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段
        exclude = None  # 排除的字段
        fields = ['username', 'password', 'code']

1.4. widget/labels使用一

from django import forms


class User(forms.ModelForm):
    # 1. 重新定义字段与字段规则 #2. 自定义在前端显示的名字:labels #3. 帮助提示字段 help_texts = 'xx' #4.用法一 widget/labels
    password = forms.CharField(labels='密码',
                               help_texts='xx',
                               max_length=11,
                               min_length=5,
                               widget=forms.PasswordInput(attrs={'xxx': 'c1'}))

    code = forms.CharField(labels='验证码',
                           help_texts='xx',
                           max_length=11,
                           min_length=5,
                           widget=forms.PasswordInput(attrs={'xxx': 'c1'}))

    class Meta:
        model = models.user  # 对应的Model中的类
        # 字段注册三种方式
        fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段

    
     

1.5. widget/labels使用二

from django import forms


class User(forms.ModelForm):
    # 1. 重新定义字段与字段规则 #2. 自定义在前端显示的名字:labels #3. 帮助提示字段 help_texts = 'xx' 
    class Meta:
        model = models.user  # 对应的Model中的类
        fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段
        
        # widgets用法二:(总的widgets用法,可以单独在每个字段当中使用)
        from django.forms import widgets
        widgets = {
            "username": widgets.Textarea(attrs={"class": "c1"})  # 还可以自定义属性
        }

        # labels用法二:,自定义在前端显示的名字
        labels = {
            "name": "用户名"
        }

1.6 局部钩子/全局钩子

from django import forms


class User(forms.ModelForm):
    # 1. 重新定义字段与字段规则 #2. 自定义在前端显示的名字:labels #3. 帮助提示字段 help_texts = 'xx' 
    class Meta:
        model = models.user  # 对应的Model中的类
        fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段
        # error_messages用法:
        
    def clean_username(self):
        # 跟form一样
        return username

    def clean(self):
        # 跟form一样
        return self.cleaned_data

1.7 整体使用

from django import forms


class User(forms.ModelForm):
    # 1. 重新定义字段与字段规则 #2. 自定义在前端显示的名字:labels #3. 帮助提示字段 help_texts = 'xx' 
    password = forms.CharField(labels='密码',
                               help_texts='xx',
                               max_length=11,
                               min_length=5,
                               widget=forms.PasswordInput(attrs={'xxx': 'c1'}))

    code = forms.CharField(labels='验证码',
                           help_texts='xx',
                           max_length=11,
                           min_length=5,
                           widget=forms.PasswordInput(attrs={'xxx': 'c1'}))

    class Meta:
        model = models.user  # 对应的Model中的类
        # 字段注册三种方式
        fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段

        error_messages = {
            'username': {'required': "用户名不能为空", },
            'password': {'required': "密码不能为空", },
        }

        from django.forms import widgets
        widgets = {
            "username": widgets.Textarea(attrs={"class": "c1"})  # 还可以自定义属性
        }


    
    def clean_username(self):
        # 从cleaned_data中取出想要的数据
        username = self.cleaned_data.get("username")
        if "2b" in username:
            # 错误就抛异常
            raise ValidationError("不符合社会主义核心价值观!")
        return username
 
    # 通过Form表单的全局钩子函数来验证两次输入的密码是否正确
    # 该clean方法, 在每个字段都校验通过之后才调用执行
    #  raise ValidationError  self.add_error()  前者不会把错误的键值对,放回cleaned_data字典中,后者会放回cleaned_data字典中

    def clean(self):
        password = self.cleaned_data.get('password')
        re_password = self.cleaned_data.get('re_password')
        if password == re_password:
            # 判断正确就返回校验过后的数据
            return self.cleaned_data
        self.add_error('re_password', '两次密码输入不一致')

1.8 view(普通使用)

def index(request):
    if request.method == "GET":
        obj = UserInfoModelForm()
        return render(request,"index.html",{'obj':obj})
    elif request.method == "POST":
        obj = UserInfoModelForm(request.POST)
        print(obj.is_valid())  # 这是方法,别忘记了加括号
        print(obj.cleaned_data)
        print(obj.errors)
        return render(request,"index.html",{'obj':obj})

1.9 不需要用户添加的字段,但是需要在后端添加

def auction_item_add_view(request, pk):
    """添加拍品"""
    auction_object = models.Auction.objects.filter(id=pk).first()
    if request.method == 'GET':
        form = AuctionItemAdd()
        return render(request, 'auction_item_add.html', context={'form': form, 'auction_object': auction_object})
    form = AuctionItemAdd(data=request.POST, files=request.FILES)
    if form.is_valid():
        # 保存之前,需要把用户不用传的数据,填上
        form.instance.auction = auction_object
        form.instance.uid =  datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')
        form.save()
        return JsonResponse({'status': 201})
    return JsonResponse({'status': 400})

2.0 get请求的参数,post需要用

def auction_item_add_view(request, pk):
    """添加拍品"""
    auction_object = models.Auction.objects.filter(id=pk).first()
    if request.method == 'GET':
        form = AuctionItemAdd()
        return render(request, 'auction_item_add.html', context={'form': form, 'auction_object': auction_object})
    form = AuctionItemAdd(data=request.POST, files=request.FILES)
    if form.is_valid():
        # 保存之前,需要把用户不用传的数据,填上
        form.instance.auction = auction_object
        form.instance.uid = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')
        form.save()
        return JsonResponse({'status': 201})
    return JsonResponse({'status': 400})

2.1 前端传文件类型数据,后端接受

form = AuctionItemAdd(data=request.POST, files=request.FILES)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑猪去兜风z1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值