是否有可能改变HTML"价值"对于一个django渲染形式字段?

时间:2017-08-24 15:27:20

标签: javascript python html django

基本上,我有一个表单,其中包含一个名为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)]

1 个答案:

答案 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}}属性中获得合适的值标签

希望这会对你有所帮助。谢谢。