当前位置: 首页 > 面试题库 >

Django的ModelForm unique_together验证

傅恺
2023-03-14
问题内容

我有一个看起来像这样的Django模型。

class Solution(models.Model):
    '''
    Represents a solution to a specific problem.
    '''
    name = models.CharField(max_length=50)
    problem = models.ForeignKey(Problem)
    description = models.TextField(blank=True)
    date = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = ("name", "problem")

我使用一种形式添加模型,如下所示:

class SolutionForm(forms.ModelForm):
    class Meta:
        model = Solution
        exclude = ['problem']

我的问题是,SolutionForm不会验证Solutionunique_together约束,因此IntegrityError在尝试保存表单时会返回。我知道我可以validate_unique用来手动检查此问题,但我想知道是否有任何方法可以在表单验证中捕获此问题并自动返回表单错误。

谢谢。


问题答案:

我通过重写validate_unique()ModelForm 的方法解决了相同的问题:

def validate_unique(self):
    exclude = self._get_validation_exclusions()
    exclude.remove('problem') # allow checking against the missing attribute

    try:
        self.instance.validate_unique(exclude=exclude)
    except ValidationError, e:
        self._update_errors(e.message_dict)

现在,我只是始终确保表单上未提供的属性仍然可用,例如instance=Solution(problem=some_problem)在初始化程序上。



 类似资料:
  • 问题内容: 尝试从教程中制作简单表格时,我收到CSRF验证失败的消息。我对CSRF验证实际上是什么进行了一些研究,据我所知,要使用CSRF验证,你需要在html中使用其中的csrf_token标记之一,但是我没有 这是我的模板: 相当简单,位于contact.html 这是我的urlconf:从 应用程序名称为testapp1。当我键入URL(http:// localhost:8000 / te

  • 问题内容: 我有一个模型与ManyToManyField类似(模型Word也有一种语言): 当尝试添加新句子时(例如通过django admin),我得到了。这意味着我在保存self.words之前无法访问它,但这正是我想要做的。有什么办法可以解决此问题,以便你仍然可以验证此模型?我真的很想直接验证模型的字段。 我发现了许多与此异常有关的问题,但找不到解决我的问题的帮助。我将不胜感激任何建议! 问

  • 问题内容: 我想在管理员更改表单中强制使用整个内联表单集。因此,在当前情况下,当我在“发票”表单(在“管理员”中)中单击“保存”时,内联订单表单为空白。我想阻止人们创建没有关联订单的发票。 有人知道这样做的简单方法吗? 在此实例中,模型字段上的常规验证(如)似乎不起作用。 问题答案: 最好的方法是定义一个自定义表单集,使用一种干净的方法来验证至少存在一个发票订单。

  • 问题内容: 我已在中注释掉了csrf处理器和中间件产品线 但是,当我使用Ajax发送请求时,Django仍然会响应“ csrf令牌不正确或丢失”,并且在将X-CSRFToken添加到标头后,请求将会成功。 这里发生了什么 ? 问题答案: 如果只需要一些视图而不使用CSRF,则可以使用@csrf_exempt:

  • 本文向大家介绍Django实现表单验证,包括了Django实现表单验证的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Django实现表单验证的具体代码,供大家参考,具体内容如下 models.py form.py view.py register.html 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: 假设我有一个模型,并且想验证是否 可以添加s个以上的代码: 但是,试图保存时, 一个 因为超过最大递归深度被抛出。 错误如下: 它发生在行中。 显然,在保存模型时,Django的复杂性根本不允许您验证m2m关系。那我该如何验证它们呢? 问题答案: 您 永远无法 使用模型的干净方法来验证关系。这是因为在清理时间,该模型可能不存在,就像您的购物篮一样。不存在的东西,也可能没有关系。 您要么