Использование переключателя в формах в наборе форм в django

У меня есть страница, на которой я отображаю различные формы, используя наборы форм.

Это мои модели:

class Phone(models.Model):
    mac = models.CharField()

class PhoneLine(models.Model):
    phone = models.ForeignKey(Phone)
    voicemail = models.BooleanField("Voice Mail", default=False)

У телефона может быть много линий (телефонных линий), но голосовая почта может быть включена только для одной телефонной линии.

По умолчанию, когда я отображаю телефонные линии с помощью набора форм, поле голосовой почты отображается в виде флажка следующим образом. (Я добавил префикс к набору форм, исходя из требований)

form1 of the formset
<input type="checkbox" name="phone_client_line_1-0-voicemail" id="id_phone_client_line_1-0-voicemail">

form2 of the formset
<input type="checkbox" name="phone_client_line_1-1-voicemail" id="id_phone_client_line_1-1-voicemail">

(Проверка и снятие флажков обновляет серверную часть)

На основе этого потока Django - Show BooleanField в наборе форм как одна группа переключателей, я изменил методы init и add_prefix моей формы телефонной линии, чтобы теперь отображать поле голосовой почты в виде переключателей.

class PhoneLineForm(ModelForm):

def __init__ (self, *args, **kwargs):
    super(PhoneLineForm, self).__init__(*args, **kwargs)
    self.fields['voicemail'] = BooleanField( widget = RadioSelect(choices=((self.prefix+"-"+str("voicemail"), 'Voicemail LIne'),)))

def add_prefix(self, field):
    if field == 'voicemail': return ('%s_%s') %(field, self.instance.phone.id)
    else: return self.prefix and ('%s-%s' % (self.prefix, field)) or field

Это изменяет вывод html на следующее:

form1 of the formset
<input type="radio" id="id_voicemail_1_0" value="phone_client_line_1-0-voicemail" name="voicemail_1">

form2 of the formset
<input type="radio" id="id_voicemail_1_0" value="phone_client_line_1-1-voicemail" name="voicemail_1">

Как видите, теперь для радиополя voicemail_1 у меня есть значение выбранной телефонной линии. Если я отправлю эту форму, после того, как я выберу радио voicemail_1, она не обновит базу данных.

Как я могу зафиксировать значение телефонной линии, выбранной при отправке? Если я перезапишу метод сохранения формы телефонной линии, что он должен содержать..?

Любые указатели на это будут оценены. Спасибо!!


person akotian    schedule 07.08.2012    source источник


Ответы (1)


На самом деле я бы предложил упростить это и положиться на JavaScript (вы всегда можете проверить на стороне сервера и показать сообщение пользователю, если он выбрал более одной телефонной линии с голосовой почтой, потому что у них не включен JavaScript).

Это было бы проще, чем пытаться взломать имена и значения полей. Наборы форм Django достаточно сложны, чтобы бороться с ними в лучшие времена, поэтому добавление дополнительной сложности на стороне сервера часто не стоит хлопот, особенно когда проблема может быть решена — не слишком неэлегантным способом — с помощью небольшой разумной работы с jQuery. .

$('input[name^="voicemail_"]').on('click',
    function() {
        $('input[name^="voicemail_"]').not($(this)).prop('checked', false);
    }
);

Просто грубое предложение; надеюсь, что это полезно.

person Steadman    schedule 16.10.2015