Django -使用“CreateView”显示表单无效时的错误消息

8zzbczxx  于 2022-12-05  发布在  Go
关注(0)|答案(1)|浏览(165)

下面是我的简化的“ProjectCreate”ClassBasedView:

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(ProjectCreate, self).get_form(form_class)
        form.fields.pop('creation_date')
        return form

    def form_valid(self, form):
        if form.instance.name == "not_valid_name":
            return super().form_invalid(form)
        form.instance.last_editor = self.request.user
        form.instance.last_modification_date = datetime.datetime.now()
        return super().form_valid(form)

我希望仅在名称不是“not_valid_name”时创建项目
如果名称是“not_valid_name”,我希望显示一条错误消息(说明名称无效),并将用户带回到“project create”页面
如果你需要任何额外的信息来了解我的问题,不要犹豫,问我。
谢谢你:)

i7uq4tfw

i7uq4tfw1#

您可以在不同级别实现这一点:

  • Form级别:here是指向文档中相应页面的链接。简单来说,使用字段nameclean方法,下面的代码应该很容易理解:
from django import forms
from ??? import Project

class ProjectForm(forms.ModelForm):
    # I assume you already have some code here
    def clean_name(self):
        name = self.cleaned_data.get("name")
        if name in ["invalid_name_1", "invalid_name_2"]: # etc.
            raise ValidationError("Forbidden value for this field.")
        return name

    class Meta(forms.ModelForm.Meta):
        model = Project

使用此代码(以及模板中的其他几行代码),客户端将看到以下内容:

  • Model级别:您可以使用自定义验证器。请查看this page以了解更多信息,它编写得非常好。
  • View级别,正如您尝试的那样,应该有一种方法,但我认为这不是最好的解决方案,因为将验证逻辑保留在表单和模型字段中更简洁。在编辑Project示例时,您可能希望在admin应用中保留相同的约束。如果你更喜欢另一种选择,这是一个提示:this page列出了CreateView中所有可用且有用的方法。

相关问题