Django - Показать 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)

Я использую Phone в ModelForm в качестве набора форм. Я пытаюсь показать Phone.primary в качестве переключателя рядом с каждым экземпляром Phone. Если я сделаю первичным виджет 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 для этого экземпляра) и сгруппировать весь набор переключателей, чтобы можно было выбрать только один из них.

Я также ищу чистый способ сделать это, я могу сделать большую часть вышеперечисленного вручную - в моей голове - но мне интересно посмотреть, есть ли лучший способ сделать это, способ в стиле джанго.

У кого-нибудь есть идея?


person Aziz Alfoudari    schedule 18.03.2012    source источник


Ответы (1)


Хорошо, у вас тут две дилеммы. Во-первых, вам нужно сгруппировать все радио-выборы из разных наборов форм, присвоив им один и тот же атрибут имени HTML. Я сделал это с переопределением add_prefix ниже.

Затем вы должны убедиться, что «основное» поле в ваших данных сообщения возвращает что-то значимое, из чего вы можете определить, какой телефон был выбран (в данных POST должно быть только одно значение «имя», потому что вы можете выбрать только один переключатель внутри группы). Назначив правильное значение префикса (это необходимо сделать в разделе _init_, чтобы вы могли получить доступ к экземпляру self), вы сможете связать «основной» value с остальными данными формы (с помощью специального метода сохранения).

Я протестировал набор форм со следующим, и он выдал правильный 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
person Eric H.    schedule 18.03.2012