基本上,我有一个表单,其中包含一个名为Queue
的字段的无线电选择小部件。 Queue
有4个选项,来自model
,通过views.py
访问和设置。我通过{{form.queue.0}}
,{{form.queue.1}}
等在我的模板上呈现此表单。
例如,{{form.queue.3}}
给了我:
<input id="id_queue_3" name="queue" value="2" type="radio">
正如您所看到的,有一个值和字段索引不匹配 - queue.3
显示为value="2"
,而这正在弄乱一些使用该值打开正确的菜单子集的JS每个单选按钮。
我是否可以通过手动指定value
来在模板上呈现无线电字段?
我的forms.py
:
class PublicTicketForm():
queue = forms.ChoiceField(
widget=forms.RadioSelect(),
label=_('What do you need help with?'),
required=True,
choices=()
)
我的views.py
表单:
form = PublicTicketForm(initial=initial_data)
form.fields['queue'].choices = [('', 'Other')] + [
(q.id, q.title) for q in Queue.objects.filter(allow_public_submission=True)]
答案 0 :(得分:0)
在您的代码中尝试以下操作:
form = PublicTicketForm(initial=initial_data)
form.fields['queue'].choices = [('', 'Other')] + [
((int(q.id)+1), q.title) for q in Queue.objects.filter(allow_public_submission=True)]
注意:我认为您希望value
标记的<input>
属性中的常量更改(增量为1)。
例如:
<input id="id_queue_3" name="queue" value="2" type="radio">
<input id="id_queue_4" name="queue" value="3" type="radio">
变为
<input id="id_queue_3" name="queue" value="3" type="radio">
<input id="id_queue_4" name="queue" value="4" type="radio">
在代码段中详细说明:
queue = forms.ChoiceField(
widget=forms.RadioSelect(),
label=_('What do you need help with?'),
required=True,
choices=()
)
属性choices
采用一个简单的元组结构,如:
(('I_become_the_value_1' , 'I_appear_on_browser_screen_1'),
('I_become_the_value_2' , 'I_appear_on_browser_screen_2'),
#and so on...
)
因此,当您提供pk( q.id是模型的pk值)作为元组的第一个索引时,pk值实际上变为value
属性。 <input>
代码。
注意:您应该始终知道Django中ChoiceField主干结构中value
标记中的<input>
属性。它有助于映射用户选择的值。
最后,请确保在提交表单时通过交叉检查成功检索用户选择的确切值。您可能还需要进行调整。 在您的视图中,用户在浏览器中选择的选项可能无法正确接收。(pk值可能会混淆)
编辑:如我所知,我也觉得在pk中使用增量不是一个很好的解决方案。为避免这种情况,您可以通过 UUIDField 声明自己的主键字段。了解它here.这将允许您在value
标记的<input>
属性中获取大字符串(唯一)。使用它像:
在models.py中:
class Queue(models.Model):
#all your fields.
alternative_unique_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
#Rest of the code.
现在您可以以相同的方式查询它,但添加 alternative_unique_field 作为元组的第一个索引。
你的views.py中的
form = PublicTicketForm(initial=initial_data)
form.fields['queue'].choices = [('', 'Other')] + [
(q.alternative_unique_id, q.title) for q in Queue.objects.filter(allow_public_submission=True)]
此外,您也可以将此alternative_unique_id声明为主键。 这将节省数据库中的一些空间。
第二种方法:您可以通过在字段内设置primary_key=True
来创建自己的主键字段,而不是使用UUIDField。你可以这样做:
name = models.CharField(primary_key = True , max_length = 64)
但请确保它始终是唯一的,并更改form.fields['queue'].choices
中的某些逻辑,以便在value
的{{1}}属性中获得合适的值标签
希望这会对你有所帮助。谢谢。