如何为Django CreateView返回现有的匹配记录

dddzy1tm  于 2023-05-30  发布在  Go
关注(0)|答案(1)|浏览(86)

我使用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,因为我们事先不知道将返回哪个现有对象。

9rygscc1

9rygscc11#

为了实现您所描述的行为,而不是引发重复记录的错误,您希望返回现有对象,下面是如何实现它的示例:

class CreateObjectOfMyModel(CreateView):
    model = MyModel
    fields = ['value']

    def get_form(self, form_class=None): 
        form = super().get_form(form_class) 
        value = form.data.get('value')
        form.fields['value'].queryset = MyModel.objects.filter(value=value)
        return form

get_form方法在这个类的基视图中是overridden,它使用super().get_form(form_class)调用get_form方法来获取基窗体对象。然后在表单的value字段中过滤掉重复的记录,我还添加了一行,用于使用form.data.get('value')从表单数据中检索输入的值。希望能成功。

相关问题