Django中使用CreateView在表单无效时显示错误消息的问题
解决方案
方法一:在表单类中添加验证逻辑(推荐)
将名称验证逻辑放到ProjectForm中,符合Django表单验证的最佳实践,代码更清晰易维护:
from django import forms from .models import Project class ProjectForm(forms.ModelForm): class Meta: model = Project fields = ['name', 'creation_date', 'price'] def clean_name(self): name = self.cleaned_data.get('name') if name == "not_valid_name": raise forms.ValidationError("名称无效") return name class ProjectCreate(LoginRequiredMixin, SuccessMessageMixin, CreateView): model = Project form_class = ProjectForm success_message = "Project successfully created" success_url = "project-list" def get_form(self, form_class=None): form = super().get_form(form_class) form.fields.pop('creation_date') return form def form_valid(self, form): form.instance.last_editor = self.request.user form.instance.last_modification_date = datetime.datetime.now() return super().form_valid(form)
方法二:在视图的form_valid方法中处理
如果一定要在视图层处理,需要手动将错误信息添加到表单的name字段,再返回form_invalid:
from django import forms from django.views.generic.edit import CreateView from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.messages.views import SuccessMessageMixin from .models import Project import datetime class ProjectForm(forms.ModelForm): class Meta: model = Project fields = ['name', 'creation_date', 'price'] class ProjectCreate(LoginRequiredMixin, SuccessMessageMixin, CreateView): model = Project form_class = ProjectForm success_message = "Project successfully created" success_url = "project-list" def get_form(self, form_class=None): form = super().get_form(form_class) form.fields.pop('creation_date') return form def form_valid(self, form): if form.instance.name == "not_valid_name": # 添加错误信息到name字段 form.add_error('name', "名称无效") return self.form_invalid(form) form.instance.last_editor = self.request.user form.instance.last_modification_date = datetime.datetime.now() return super().form_valid(form)
说明
- 方法一中,
clean_name方法是Django表单的字段级验证方法,会在表单验证阶段自动执行,验证失败时抛出的ValidationError会被自动渲染到表单的对应字段下方。 - 方法二中,通过
form.add_error('name', "名称无效")手动添加错误信息,再调用form_invalid返回表单页面,这样用户就能看到自定义的错误提示。
内容的提问来源于stack exchange,提问作者Alexandre Boucard
相关产品推荐
相关产品推荐

