<p>你确实需要一些多对多:</p>
<pre><code>class Bookmaker(models.Model):
name = models.CharField(max_length=50)
accepted_countries = models.ManyToMany('Country',related_name='accepted')
restricted_countries = models.ManyToMany('Country', related_name= 'restricted')
class Country(models.Model):
name = models.CharField(max_length=50)
bookmakers = models.ManyToMany(Bookmaker)
</code></pre>
<p>然后,如果您创建一个表格来编辑一个博彩公司,您将被缩写为添加名称、接受和限制的国家:</p>
<p>表单.py</p>
<pre><code>class BookmakerForm(models.ModelForm):
class Meta:
model = Bookmaker
fields = ['name', 'accepted_countries', 'restricted_countries']
#for having a better default display you can change the widget:
self __init__(self, *args, **kwargs):
super(BookmakerForm, self).__init__(*args, **kwargs)
self.fields['accepted_countries'].widget = CheckboxSelectMultiple()
self.fields['restricted_countries'].widget = CheckboxSelectMultiple()
</code></pre>
<p>默认情况下,如果只需要检查<code>form.is_valid()</code>并保存。django modelform将为您管理中间步骤</p>
<p>Country中的bookmakers字段允许您检索与某个国家/地区关联的所有bookmaker,而不必同时签入accepted和restricted(这更方便)</p>
<p>但您需要将庄家添加到您视图上的列表中,例如:</p>
<pre><code>class CreateBookmakerView(CreateView):
model = Bookmaker
form_class = BookmakerForm
success_url = reverse_lazy('your success url name here')
def form_valid(self,form):
bookmaker = form.save()
bookmaker.country_set.add(bookmaker)
bookmaker.save()
return HttpResponseRedirect(self.get_success_url())
</code></pre>