Django:具有唯一约束的CreateView和UpdateView中的不同行为

时间:2019-05-19 18:45:15

标签: python django django-forms django-class-based-views

class Badge(Model):
    # ....

    class Meta:
        unique_together = ('identifier', 'restaurant')
  • 使用一个CreateView,当创建一个其标识符已经存在的Badge对象时,我实际上收到了一个表单错误,这是预期的行为。

  • 但是,使用UpdateView时,在编辑其标识符已经存在的Badge对象时,我不会遇到任何形式错误,但是会出现duplicate key value violates unique constraint的500错误。

我不明白为什么行为会有所不同。我希望在两种情况下都显示表单错误。

1 个答案:

答案 0 :(得分:1)

我刚刚意识到要进行验证,即使在用户不应该填写所有字段的情况下,也必须在基于类的视图中指定所有字段。

class BadgesUpdateView(UpdateView):
    model = Badge
    # restaurant field must be included for validation even if the user does NOT fill it.
    fields = ('identifier', 'is_active', 'owner', 'restaurant')

    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.fields['restaurant'].widget = forms.HiddenInput()
        return form