ako*_*ian 5 django django-forms radio-button
我有一个页面,我使用formsets显示不同的表单.
这些是我的模特:
class Phone(models.Model):
mac = models.CharField()
class PhoneLine(models.Model):
phone = models.ForeignKey(Phone)
voicemail = models.BooleanField("Voice Mail", default=False)
Run Code Online (Sandbox Code Playgroud)
手机可以有多条线路(电话线),但只有一条电话线可以启用语音信箱.
默认情况下,当我使用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">
Run Code Online (Sandbox Code Playgroud)
(选中和取消选中复选框会更新后端)
基于这个线程,Django - 在一个formset中将BooleanField显示为一组单选按钮,我修改了我的phoneline表单的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
Run Code Online (Sandbox Code Playgroud)
这会将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">
Run Code Online (Sandbox Code Playgroud)
如你所见,现在对于无线电领域voicemail_1,我有所选电话线的价值.如果我提交此表单,在选择voicemail_1电台后,它不会更新数据库.
如何捕获提交时选择的电话线的价值?如果我覆盖了phonelineform的保存方法,它应该是什么...?
任何关于此的指示将不胜感激.谢谢!!
我实际上建议简化这一点,并依赖 JavaScript(如果用户选择了多个带有语音邮件的电话线路,则您始终可以验证服务器端并向用户显示一条消息,因为他们没有启用 JavaScript)。
这比尝试破解字段名称和值更简单。Django 表单集在最好的情况下都很难解决,因此增加服务器端的复杂性通常不值得这么麻烦,特别是当问题可以通过一些明智的 jQuery 工作以一种不太不优雅的方式解决时。
$('input[name^="voicemail_"]').on('click',
function() {
$('input[name^="voicemail_"]').not($(this)).prop('checked', false);
}
);
Run Code Online (Sandbox Code Playgroud)
只是一个粗略的建议;希望它有用。
| 归档时间: |
|
| 查看次数: |
1028 次 |
| 最近记录: |