2012-08-07 63 views
3

我有一个页面,其中使用formset显示不同的表单。在django中的formset中使用单选按钮

这是我的模型:

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

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

一个电话就可以有很多线(电话线),但只有一条电话线可以启用语音邮件。

默认情况下,当我显示使用表单集phonelines,语音邮件字段显示为如下的复选框。(我已经根据要求添加前缀表单集)

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广播后,它不会更新数据库。

如何捕获提交时选择的电话线的值?如果我覆盖了电话线形式的保存方法,应该怎么控制..?

任何指针,将不胜感激。谢谢!!

回答

1

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

这会比试图破解字段名称和值更简单。 Django formset已经足够艰苦了,它们可以在最好的时候进行争吵,因此增加服务器端的复杂性通常是不值得的,尤其是当问题可以通过一些精心设计的jQuery工作来解决时。

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

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