首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在django中使用表单中的单选按钮

在django中使用表单中的单选按钮
EN

Stack Overflow用户
提问于 2012-08-07 13:20:32
回答 1查看 1.3K关注 0票数 5

我有一个页面,在该页面中,我使用表单集显示不同的表单。

这些是我的模型:

代码语言:javascript
复制
class Phone(models.Model):
    mac = models.CharField()

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

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

默认情况下,当我使用formset显示电话线时,语音邮件字段将显示为一个复选框,如下所示(我已根据需求向该窗体集添加了前缀)

代码语言:javascript
复制
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方法,现在将语音信箱字段显示为单选按钮。

代码语言:javascript
复制
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输出修改为以下内容:

代码语言:javascript
复制
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收音机后,它不会更新数据库。

如何捕捉在提交时选择的电话线的值?如果我覆盖音素的保存方法,它应该写什么?

任何关于这方面的建议都将不胜感激。谢谢!!

EN

回答 1

Stack Overflow用户

发布于 2015-10-16 23:32:10

实际上,我建议简化这一点,并依赖于JavaScript (如果用户选择了多条带有语音信箱的电话线,因为他们没有启用JavaScript,则始终可以验证服务器端并向用户显示消息)。

这将比试图破解字段名和值更简单。Django表单集在最好的时候是很难争论的,因此增加服务器端的复杂性通常不值得麻烦,特别是当问题可以通过一些明智的jQuery工作来解决的时候--不太不雅--的话。

代码语言:javascript
复制
$('input[name^="voicemail_"]').on('click',
    function() {
        $('input[name^="voicemail_"]').not($(this)).prop('checked', false);
    }
);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11846954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档