zoukankan      html  css  js  c++  java
  • Django之ModelForm实际操作使用

    1.定义model数据库字段如下:

    class User(models.Model):
        """
        员工信息表用户、密码、职位、公司名(子、总公司)、手机、最后一次登录时间。
        """
        username = models.CharField(max_length=32, verbose_name='用户名', unique=True)
        password = models.CharField(max_length=32, verbose_name='密码')
        position = models.CharField(max_length=32, verbose_name='职位')
        company = models.CharField(max_length=32, verbose_name='公司', blank=True,
                                   choices=(('0', '北京总公司'), ('1', '石家庄分公司'), ('2', '广州分公司')))
        phone = models.CharField(max_length=11, verbose_name='手机号')
        last_time = models.DateTimeField(null=True, blank=True, verbose_name='上次登陆时间')
        create_time = models.DateTimeField(auto_now_add=True, verbose_name='注册时间')
        is_active = models.BooleanField(default=True)
        avatar = models.ImageField(upload_to='img/avatar', default='img/avatar/dafault.jpeg')
    
        def __str__(self):
            return self.username

    2.form中定义一个通用样式类:

    from django import forms
    from django.core.exceptions import ValidationError
    import hashlib
    from app01 import models
    
    
    class BSForm(forms.ModelForm):
        """
        拥有bootstrap的样式
        """
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
    
            # 自定义的操作
            for field in self.fields.values():
                field.widget.attrs['class'] = 'form-control'

    3.ModelForm使用加校验参考:

    class RegForm(forms.ModelForm):
        # username = forms.CharField(label='xxx')
        # password = forms.CharField()
        password = forms.CharField(error_messages={'required': '这是必选项'},
                                   widget=forms.PasswordInput(attrs={'placeholder': '密码', 'type': 'password'}), label='密码',
                                   min_length=6)
        re_pwd = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': '确认密码', 'type': 'password'}),
                                 label='确认密码', min_length=6)
    
        class Meta:
            model = models.User
            fields = '__all__'  # ['username','password']
            exclude = ['last_time', 'is_active']
            # labels = {
            #     'username': '用户名'
            # }
            widgets = {
                'username': forms.TextInput(attrs={'placeholder': '用户名', 'autocomplete': 'off'}),
                'position': forms.TextInput(attrs={'placeholder': '请输入职位'}),
                # 'company':forms.Select(),
                'phone': forms.TextInput(attrs={'placeholder': '手机号'}),
            }
            error_messages = {
                'username': {
                    'required': '必填项',
                },
                'password': {
                    'required': '必填项',
                }
            }
    
        def clean_phone(self):
            import re
            phone = self.cleaned_data.get('phone')
            if re.match(r'^1[3-9]d{9}$', phone):
                return phone
            raise ValidationError('手机号格式不正确')
    
        def clean_company(self):
            # 不符合校验规则 抛出异常
            print(self.cleaned_data)
            value = self.cleaned_data.get('company')
            if not value:
                raise ValidationError('公司是必选项,请重新选择')
            return value
    
        def clean(self):
            self._validate_unique = True  # 数据库校验唯一
            password = self.cleaned_data.get('password', '')
            re_pwd = self.cleaned_data.get('re_pwd')
    
            if password == re_pwd:
                md5 = hashlib.md5()
                md5.update(password.encode('utf-8'))
                self.cleaned_data['password'] = md5.hexdigest()
                return self.cleaned_data
            self.add_error('re_pwd', '两次密码不一致!!')
            raise ValidationError('两次密码不一致')
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            # 自定义的操作
            field = self.fields['company']
            choices = field.choices
            choices[0] = ('', '选择公司')
            field.choices = choices

    4.后端注册写法:

    def register(request):
        form_obj = RegForm()
        if request.method == 'POST':
            form_obj = RegForm(request.POST, request.FILES)
            if form_obj.is_valid():
                # 注册成功
    
                form_obj.save()
                return redirect('login')
    
        return render(request, 'register.html', {'form_obj': form_obj})
  • 相关阅读:
    server 2016部署网络负载平衡(NLB)
    Windows Server 2012 搭建DHCP及远程路由访问
    第一章 Windows Server 2016网络管理
    不懂 ZooKeeper?没关系,这一篇给你讲的明明白白
    更新bios后进不了系统
    ICP备案和ICP许可证
    C# 解决“请求被中止: 未能创建 SSL/TLS 安全通道”的问题
    Is EnableViewStateMAC=true compulsory for ViewStateEncryption in an ASP.Net Website?
    Uses for MachineKey in ASP.NET
    5月底更新后桌面右下角出现的新闻资讯怎么删除?
  • 原文地址:https://www.cnblogs.com/wenyeqing/p/14051802.html
Copyright © 2011-2022 走看看