2016-01-21 56 views
0

我創建了兩個模型:Django表單 - 檢查每一個對象沒有表現出他們

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',) 

但這個代碼給用戶可能選擇的對象,並取消一些。如何改變它?

對我來說,最好的想法是當用戶創建他的「世界」 - 他只能輸入世界名稱,他沒有看到國家的名字,但每個對象「國家」將包括在他的「世界」。那可能嗎?我如何更改表單中的代碼來執行此類操作?

回答

0

我認爲我們可以通過重寫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 
+0

謝謝您的回覆!表單現在看起來像我想要它,但是當我保存它時,我得到一個錯誤(你有想法?):TypeError在/ world/ save()得到了一個意外的關鍵字參數'commit' – znawca

+0

抱歉,它只是一個錯字,看看更新的'save()'簽名。我在那裏加了一個克瓦格。 –

+0

好吧,我添加了'commit = True'來保存()簽名,現在我得到:「int()參數必須是字符串或數字,而不是'QuerySet',我試着改變它,但我不知道究竟在哪裏是錯誤的,但可能這個世界是沒有任何國家的創造。它與「is_new」是什麼? – znawca

相關問題