Django - Показать BooleanField в наборе форм как одну группу переключателей - PullRequest
6 голосов
/ 18 марта 2012

У меня есть следующие модели:

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

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

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

1 Ответ

4 голосов
/ 19 марта 2012

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

Затем вы должны убедиться, что поле 'primary' в ваших данных поста возвращает что-то значимое, из чего вы можете определить, какой телефон был выбран (в данных POST должно быть только одно значение 'name', т.к. выберите только одну радиокнопку из группы). Назначив правильное значение префикса (это необходимо сделать в _ 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
...