我使用Django
的常规generic.edit.CreateView
根据用户输入创建一个对象。MyModel
有一个UniqueConstrait
,所以如果新对象碰巧与现有对象匹配,创建将失败。
但是,我不想告诉用户由于重复记录而导致创建失败,而是简单地返回现有对象,因为这是用户想要的。我试过重写
def save(self, commit=True):
return MyModel.get_or_create(value=self.cleaned_data['value'])[0]
但这不起作用,因为form._post_clean
将使用其默认值validate_constraints=True
调用form.instance.full_clean
,因此在表单验证期间将返回错误。
本质上,我正在寻找一个GetOrCreateView
,但我不确定什么是一个干净的方式来实现这一点(除了可能覆盖form._full_clean
)。请注意,我并没有寻找UpdateView
,因为我们事先不知道将返回哪个现有对象。
1条答案
按热度按时间9rygscc11#
为了实现您所描述的行为,而不是引发重复记录的错误,您希望返回现有对象,下面是如何实现它的示例:
get_form
方法在这个类的基视图中是overridden
,它使用super().get_form(form_class)
调用get_form
方法来获取基窗体对象。然后在表单的value
字段中过滤掉重复的记录,我还添加了一行,用于使用form.data.get('value')
从表单数据中检索输入的值。希望能成功。