2012-03-18 15 views
4

の一つのグループとして、フォームセットで、私は次のモデルがあります:ジャンゴ - ショーのBooleanFieldラジオボタン

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) 

私は、フォームセットとしてのModelFormでPhoneを使用しています。私がしようとしているのは、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を設定する必要があります)の隣にラジオボタンを1つのみ表示する方法を探しています。ラジオボタンのすべてのセットをグループ化して、それらの1つだけを選択できます。

私はこれを行うきれいな方法を探しています。私は頭の中で上記のほとんどを手作業で行うことができますが、もっと良い方法があるかどうかを知りたいと思っています。スタイルの方法。

誰かがアイデアを得ましたか?

答えて

3

ここで2つのジレンマがあります。まず、同じHTML名属性を与えて、異なるフォームセットのすべてのラジオ選択をグループ化する必要があります。私はadd_prefixの下書きでこれを行いました。

次に、あなたのポストデータの「プライマリ」フィールドが何か意味のあるものを返すようにしなければなりません。これにより、選択された電話機を特定することができます(POSTデータの 'name'グループ内からラジオボタンを1つだけ選択できます)。適切なプレフィックス値を割り当てることで(これは_ _で実行する必要がありますので、自己インスタンスにアクセスすることができます)、 'primary'値を残りのフォームデータと関連付けることができますカスタム保存メソッド)。

私は以下のフォームセットをテストし、正しい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