1

我有一种情况,我需要在将表单保存到 views.py 之前检查表单是否具有 m2m 关系,因为我对不同的模型使用相同的 views.py。

例子:

#models.py
class BaseClass(models.Model):
   # Some generic stuff.

class SomeClass(BaseClass):
   # This class doesnt have any many2many relations

class SomeOtherClass(BaseClass):
   # This class has many2many relations

#views.py
def do_some_stuff(request):
   # Instantiate a form
   # Save it in a normal way
   form.save()
   # Now, in here while saving I need to check if the form has any 
   # m2m relations so I can use the save_m2m() function after form.save()

我只需要在那里进行额外的检查以确保安全。有没有办法解决?提前致谢

4

4 回答 4

0

安东尼是对的,而且更容易,我从文档中引用:

commit=False当您的模型与另一个模型具有多对多关系时,会看到使用的另一个副作用。如果您的模型具有多对多关系并且您指定commit=False何时保存表单,则 Django 无法立即保存多对多关系的表单数据。这是因为在实例存在于数据库中之前,无法为实例保存多对多数据。

为了解决这个问题,每次您使用 保存表单时commit=False,Djangosave_m2m()都会向您的 ModelForm 子类添加一个方法。

据此,如果您commit=False使用该方法保存表单,则save_m2m() 甚至不存在,无论是否存在多对多关系。

忠实于 Python 的座右铭“请求宽恕比许可更容易”,您还可以这样做:

try:
    form.save_m2m()
except:
    pass

如果你真的想。

于 2010-01-20T17:37:40.463 回答
0

我只是想出了可能的解决方案。

你可以使用这样的东西:

if len(form_instance._meta.many_to_many) > 0:
   for i in form_instance._meta.many_to_many:
      if type(i) = ManyToManyField:
         form_instance.save_m2m()
         break
于 2010-01-20T14:58:20.907 回答
0

实际上,save_m2m()总是ModelFormsave(commit=False). 即使ManyToMany模型中没有字段。

这是save_m2m函数的来源:

def save_m2m():
    opts = instance._meta
    cleaned_data = form.cleaned_data
    for f in opts.many_to_many:
        if fields and f.name not in fields:
            continue
        if f.name in cleaned_data:
            f.save_form_data(instance, cleaned_data[f.name])

如果没有ManyToMany字段 ( instance._meta.many_to_many=[]),则不会执行任何操作。

save_m2m因此,您可以在所有情况下安全地调用。

于 2010-01-20T18:29:03.730 回答
0
if hasattr(form, 'save_m2m'):
    form.save_m2m()

您应该记住,只有在您使用参数save_m2m调用时才需要(并且仅存在) 。如果你把它保存为默认的,就不需要在.form.savecommit=Falsecommit=Truesave_m2m

于 2010-01-20T10:24:26.917 回答