在django中的formset中使用单选按钮

时间:2012-08-07 13:20:33

标签: django django-forms radio-button

我有一个页面,我使用formset显示不同的表单。

这些是我的模特:

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

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

手机可以有多条线路(电话线),但只有一条电话线可以启用语音信箱。

默认情况下,当我使用formset显示phonelines时,语音邮件字段显示为如下复选框。(我已根据要求在formset中添加了前缀)

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 in a formset as one group of radio buttons,我修改了我的电话线表单的 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电台后,它不会更新数据库。

如何捕获提交时选择的电话线的值?如果我覆盖了phonelineform的保存方法,那么它应该是什么...?

任何关于此的指示都将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

我实际上建议简化这一点,并依赖JavaScript(如果他们选择了多个带有语音邮件的电话线,因为他们没有启用JavaScript),您可以随时验证服务器端并向用户显示消息

这比尝试破解字段名称和值更简单。 Django formsets在最好的时候是足够强大的野兽,所以增加服务器端的复杂性往往不值得麻烦,特别是当问题可以通过一个明智的jQuery工作以一种不太优雅的方式解决时

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

只是一个粗略的准备建议;希望它有用。