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})
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步