擅长:python、mysql、java
<p>这里有一个比旧的更好的解决方案,它确实不起作用。在</p>
<p>在创建表单时,您必须从数据库加载现有的相关值,并在保存表单时将它们保存回。我对相关名称(manager)使用<code>set()</code>方法,它为您完成所有工作:删除不再被选中的现有关系,并添加已被选中的新关系。所以你不必做任何循环或检查。在</p>
<pre><code>class AssignProjectForm(ModelForm):
def __init__(self, *args, **kwargs):
super(AssignProjectForm, self).__init__(*args, **kwargs)
# Here we fetch your currently related projects into the field,
# so that they will display in the form.
self.fields['projects'].initial = self.instance.projects.all(
).values_list('id', flat=True)
def save(self, *args, **kwargs):
instance = super(AssignProjectForm, self).save(*args, **kwargs)
# Here we save the modified project selection back into the database
instance.projects.set(self.cleaned_data['projects'])
return instance
</code></pre>
<p>除了简单之外,使用<code>set()</code>方法还有另一个好处,如果您在m2m关系中使用Django信号(例如<code>post_save</code>等):如果您在循环中一次添加和删除一个条目,您将获得每个对象的信号。但是如果您在一个操作中使用<code>set()</code>来完成它,那么您将只得到一个带有对象列表的信号。如果信号处理程序中的代码执行了重要的工作,则这是一个大问题。在</p>