6

私は次のモデルを持っています:

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)

PhoneModelForm をフォームセットとして使用しています。私がやろうとしているのはPhone.primary、の各インスタンスの横にラジオ ボタンとして表示することですPhoneRadioSelectウィジェットとしてプライマリにすると:

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

2 つのラジオ ボタンが表示され、各インスタンスの横にグループ化されます。primary=True代わりに、各インスタンスの横にラジオ ボタンを 1 つだけ表示し (そのインスタンスに設定する必要があります)、ラジオ ボタンのすべてのセットをグループ化して、そのうちの 1 つだけを選択できるようにする方法を探しています。

私はまた、これを行うためのクリーンな方法を探しています.上記のほとんどを頭の中で手動で行うことができます.

誰でもアイデアを得ましたか?

4

1 に答える 1

4

ここには 2 つのジレンマがあります。最初に、同じ HTML name 属性を指定して、異なるフォームセットからのすべてのラジオ選択をグループ化する必要があります。以下のadd_prefixオーバーライドでそれを行いました。

次に、投稿データの「プライマリ」フィールドが意味のあるものを返すことを確認する必要があります。これにより、どの電話が選択されたかを判断できます (POST データには「名前」値が 1 つしかないはずです b/c 1 つしか選択できません)グループ内のラジオ ボタン)。適切な接頭辞の値を割り当てることにより (自己インスタンスにアクセスできるように、これは_ init _の下で行う必要があります)、「プライマリ」値を残りのフォーム データに関連付けることができます (カスタム保存メソッドを介して)。 )。

次のフォームセットをテストしたところ、正しい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
于 2012-03-18T23:25:38.057 に答える