如何在Django的forms.py中实现当前用户name字段校验并抛出ValidationError
在Django的forms.py中实现当前用户name字段的唯一性校验
要把你现在写在views里的校验逻辑移到forms.py中,让表单自己处理字段校验并抛出ValidationError,按以下步骤修改:
1. 修改forms.py,添加字段校验逻辑
在表单类中重写__init__方法接收当前用户,然后针对name字段实现校验:
# forms.py from django import forms from django.core.exceptions import ValidationError from .models import URL_list class URL_listForm(forms.ModelForm): class Meta: model = URL_list fields = ['name'] # 替换成你实际需要的字段列表 def __init__(self, *args, **kwargs): # 从初始化参数中取出当前用户并保存 self.user = kwargs.pop('user') super().__init__(*args, **kwargs) def clean_name(self): # 获取清理后的name字段值 name = self.cleaned_data.get('name') # 检查当前用户是否已存在同名记录 if URL_list.objects.filter(user=self.user, name=name).exists(): raise ValidationError('Same name already added, change name') return name
2. 更新views.py,传递用户到表单
实例化表单时必须传入当前登录用户,这样表单才能拿到用户信息做校验:
# views.py @login_required def main_page(request): if request.method == "POST": # POST请求时传入用户和POST数据 form = URL_listForm(request.POST, user=request.user) if form.is_valid(): new_post = form.save(commit=False) new_post.user = request.user new_post.save() return HttpResponse("Data added") else: # GET请求时也要传入用户 form = URL_listForm(user=request.user) return render(request, 'link/main.html', {'form': form})
说明
- 这样修改后,表单会在
form.is_valid()时自动执行clean_name方法的校验,若存在同名记录,会抛出ValidationError并关联到name字段,你可以在模板中通过{{ form.name.errors }}显示错误提示,比直接返回HttpResponse的用户体验更好。 - 原来views里的手动校验逻辑可以完全移除,表单会自动处理所有校验逻辑。
内容的提问来源于stack exchange,提问作者Jordano Bruno
相关产品推荐
相关产品推荐

