gpt4 book ai didi

python - Django - form_valid() 与 save()

转载 作者:行者123 更新时间:2023-11-28 21:36:20 26 4
gpt4 key购买 nike

在 django 表单中,为了保存其他数据,我通常使用 form_valid()但我也可以使用 save()表单类的方法。

今天我覆盖了save()而不是 form_valid()我的manytomanyfield有问题。

使用时,manytomanyfield 的值没有保存,但是当我使用 form_valid() 时他们开始储蓄。谁能告诉我原因以及两者之间有什么区别,哪种方法最方便,在什么情况下?

这是我对 save() 方法的重写:

class ProductCreateForm(forms.ModelForm):
sizes = make_ajax_field(ProductCreateModel,'sizes','sizes')
colours = make_ajax_field(ProductCreateModel,'colours','colours')

class Meta:
model = ProductCreateModel

fields = ('title','category',
'regions',)

def __init__(self,*args,**kwargs):
self.request = kwargs.pop("request")
super(ProductCreateForm, self).__init__(*args, **kwargs)

def save(self):
product = super(ProductCreateForm, self).save(commit=False)
user = self.request.user

product.location = user.user_location
product.save()
return product

当我覆盖 form_valid() 方法时:
   def get_form_kwargs(self):
kwargs = super(ProductCreateView,self).get_form_kwargs()
kwargs.update({'request':self.request})
return kwargs

def form_valid(self, form):
product = form.save(commit=False)
user = self.request.user
form.instance.user = user
form.instance.location = user.user_location
form.save()
return super(ProductCreateView, self).form_valid(form)
sizes , coloursregions是 m2m 字段,正如我在覆盖 save() 时提到的那样m2m 的值没有被保存,但是当我覆盖 form_valid 时他们开始储蓄。

最佳答案

如果您使用 commit=False 保存表单,您必须调用表格的save_m2m保存多对多数据的方法。见 the docs了解更多信息。

如果您决定使用 form_valid方法,我将更改以下内容:

  • 更新 form.save() 返回的实例并保存它,而不是调用 form.save()再次。
  • 显式调用 form.save_m2m()
  • 返回重定向响应而不是调用 super().form_valid() (这将再次保存表单)

  • 把它们放在一起,你会得到:
    def form_valid(self, form):
    product = form.save(commit=False)
    product.user = self.request.user
    product.location.location = user.user_location
    product.save()
    form.save_m2m()
    return redirect('/success-url/')

    关于python - Django - form_valid() 与 save(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51172820/

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