gpt4 book ai didi

Django:验证具有排除字段的 ModelForm 中的 unique_together 约束

转载 作者:行者123 更新时间:2023-12-01 01:24:54 25 4
gpt4 key购买 nike

我有一个表格:

class CourseStudentForm(forms.ModelForm):

class Meta:
model = CourseStudent
exclude = ['user']

对于有一些复杂要求的模型:
class CourseStudent(models.Model):

user = models.ForeignKey(settings.AUTH_USER_MODEL)
semester = models.ForeignKey(Semester)
block = models.ForeignKey(Block)
course = models.ForeignKey(Course)
grade = models.PositiveIntegerField()

class Meta:
unique_together = (
('semester', 'block', 'user'),
('user','course','grade'),
)

我希望新对象将当前登录用户用于 CourseStudent.user:
class CourseStudentCreate(CreateView):
model = CourseStudent
form_class = CourseStudentForm
success_url = reverse_lazy('quests:quests')


def form_valid(self, form):
form.instance.user = self.request.user
return super(CourseStudentCreate, self).form_valid(form)

然而,这是有效的,因为用户不是表单的一部分,它错过了 Django 否则会对 unique_together 约束进行的验证。

我怎样才能让我的表单和 View 在这些约束上使用 Django 的验证,而不必自己编写?

我虽然在表单中的隐藏字段中传递用户(而不是排除它),但这似乎不安全(即可以更改用户值)?

最佳答案

设置 form.instance.userform_valid为时已晚,因为那时表单已经过验证。因为这是您唯一的自定义内容 form_valid方法确实如此,您应该将其删除。

您可以覆盖 get_form_kwargs ,并传入 CourseStudent用户已经设置的实例:

class CourseStudentCreate(CreateView):
model = CourseStudent
form_class = CourseStudentForm
success_url = reverse_lazy('quests:quests')

def get_form_kwargs(self):
kwargs = super(CreateView, self).get_form_kwargs()
kwargs['instance'] = CourseStudent(user=self.request.user)
return kwargs

这还不足以使其工作,因为表单验证跳过了引用 user 的唯一组合约束。 field 。解决方案是覆盖模型表单的 full_clean()方法,并显式调用 validate_unique() 在模型上。覆盖 clean方法(正如您通常会做的那样)不起作用,因为此时尚未使用表单中的值填充实例。
class CourseStudentForm(forms.ModelForm):

class Meta:
model = CourseStudent
exclude = ['user']

def full_clean(self):
super(CourseStudentForm, self).full_clean()
try:
self.instance.validate_unique()
except forms.ValidationError as e:
self._update_errors(e)

关于Django:验证具有排除字段的 ModelForm 中的 unique_together 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32260785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com