2012-03-18 51 views
4

我有以下型號:Django的 - 顯示BooleanField在一個formset爲一個單選按鈕組

class Profile(models.Model): 
    verified = models.BooleanField(default=False) 

    def primary_phone(self): 
     return self.phone_set.get(primary=True) 

class Phone(models.Model): 
    profile = models.ForeignKey(Profile) 
    type = models.CharField(choices=PHONE_TYPES, max_length=16) 
    number = models.CharField(max_length=32) 
    primary = models.BooleanField(default=False) 

    def save(self, force_insert=False, force_update=False, using=None): 
     if self.primary: 
      # clear the primary attribute of other phones of the related profile 
      self.profile.phone_set.update(primary=False) 
     self.save(force_insert, force_update, using) 

我使用Phone中的ModelForm作爲一個formset。我想要做的是在Phone的每個實例旁邊顯示Phone.primary作爲單選按鈕。如果我做的主要爲RadioSelect部件:

class PhoneForm(ModelForm): 
    primary = forms.BooleanField(widget=forms.RadioSelect(choices=((0, 'False'), (1, 'True')))) 

    class Meta: 
     from accounts.models import Phone 
     model = Phone 
     fields = ('primary', 'type', 'number',) 

它會顯示單選按鈕,他們將分組在一起,旁邊的每個實例。相反,我正在尋找一種方法,只顯示每個實例旁邊的一個單選按鈕(應爲該實例設置primary=True),並將所有單選按鈕組合在一起,以便只能選擇其中一個。

我也在尋找一個乾淨的方式來做到這一點,我可以手動完成上述大部分 - 在我的腦海中 - 但我很感興趣,看看是否有更好的方法來做到這一點,一個django-風格的方式。

有人有想法嗎?

回答

3

好吧,你在這裏有兩個難題。首先,你需要通過給它們相同的HTML名稱屬性來對來自不同表單集合的所有廣播選擇進行分組。我在add_prefix覆蓋下面。

然後,您必須確保發佈數據中的「主」字段返回有意義的內容,從中可以確定選擇了哪個電話(在POST數據中應該只有一個「名稱」值b/c您只能從一個組中選擇一個單選按鈕)。通過分配正確的前綴值(這需要在_ 初始化_中完成,以便您可以訪問自實例),您將能夠將「主」值與其餘的表單數據(通過自定義保存方法)。

我測試了下面的formset,它吐出了正確的html。所以試試看:

class PhoneForm(ModelForm): 
    def __init__ (self, *args, **kwargs) 
     super(PerstransForm, self).__init__(*args, **kwargs) 
     self.fields['primary'] = forms.BooleanField(widget = forms.RadioSelect(choices=((self.prefix, 'This is my Primary Phone'),)) 

    #enter your fields except primary as you had before. 
    def add_prefix(self, field): 
     if field == 'primary': return field 
     else: return self.prefix and ('%s-%s' % (self.prefix, field)) or field 
相關問題