Django Form - 检查每个对象而不显示它们

Django Form - checking every object without showing them

我创建了两个模型:

class Country(models.Model):
    name = models.CharField(verbose_name="Name of country", max_length=100, default="Australia")
    number = models.IntegerField(verbose_name="number of country", default="1")

    def __unicode__(self):
        return self.name

class World(models.Model):
    country = models.ManyToManyField(Country)
    name = models.CharField(verbose_name="New Map", max_length=100)

    def __unicode__(self):
        return self.name

我想为用户提供在现场创建新世界的可能性,但在创建过程中他无法取消选中列表中的任何对象(必须选中每个对象但他看不到它们)。 我创建了一个 form.py:

class WorldForm(forms.ModelForm):

    country = forms.ModelMultipleChoiceField(queryset = Country.objects.all(), widget=forms.CheckboxSelectMultiple())

    class Meta:
        model = World
        fields = ('name',)

但此代码使用户可以选择对象并取消选中某些对象。怎么改?

对我来说最好的想法是当用户创建他的 "world" - 他只能输入一个世界的名称而他没有看到国家的名称,但每个对象 "Country" 都将包含在他的 "world" 。那可能吗?我怎样才能更改表单中的代码来执行类似的操作?

我认为我们可以通过覆盖 ModelForm.save() 方法来实现:

class WorldForm(forms.ModelForm):
        class Meta:
                model = World
                fields = ('name',)

        def save(self, commit=True):
            super(WorldForm, self).save(commit=False)
            is_new = not self.instance.pk
            self.instance.save()

            if is_new:
                # It's a new world. Fill it with countries!
                self.instance.country.add(*Country.objects.all())
            else:
                self._save_m2m()

            return self.instance