繁体   English   中英

Django forms 带有 forloop 每次迭代唯一标识符的模板下拉列表

[英]Django forms template dropdown with unique identifier for each iteration of a forloop

我正在尝试为 for 循环项的每次迭代生成一个唯一的 ID。 生成的项目是一个下拉菜单,生成的次数将取决于活动事件的数量。 我遇到的问题是每个下拉菜单的下拉菜单 ID 都相同。 在这种情况下,通过浏览器页面源查看时 id="id_status"

有没有办法为第一个下拉菜单生成例如 id="id_status_1",然后为第二个下拉菜单生成 id="id_status_2",依此类推?

我尝试用 forloop.counter 和 javascript 的 setAttribute("id", "uniqueIdentifier") 来实现一些东西,但现在已经绞尽脑汁好几个小时都没有成功

模型.py

from django.db import models
...
...

class IncidentStatus(models.Model):
    status = models.CharField(max_length=128)

    def __str__(self):
        return self.status

forms.py:

from .models import IncidentStatus
...
...

class IncidentStatusAssigneeForm(ModelForm):
    status = forms.ModelChoiceField(queryset=IncidentStatus.objects.all().order_by('status'), empty_label='Select a Status', label='')

    class Meta:
        model = IncidentStatus
        fields = ('status',)

views.py:(用于表单集尝试)

from .models import IncidentStatus
from .forms import IncidentStatusAssigneeForm
from django.forms import modelformset_factory
...
...

def set_status(req):
    all_incidents = Incident.objects.all
    
    test_status_formset = modelformset_factory(IncidentStatus, form=IncidentStatusAssigneeForm)
    test_status = test_status_formset()
    ...
    ...
    
    context = {'test_status': test_status, 'all_incidents': all_incidents, ....}
    
    return render(req, 'incident_main/assignee.html', context)

原始views.py:

from .models import IncidentStatus
from .forms import IncidentStatusAssigneeForm
...
...

def set_status(req):
    test_status = IncidentStatusAssigneeForm()
    all_incidents = Incident.objects.all
    ...
    ...
    
    context = {'test_status ': test_status, 'all_incidents': all_incidents, ....}
    
    return render(req, 'incident_main/assignee.html', context)
    

模板.html:

{% for incident in all_incidents %} 
...
...
    {{ test_status  }}
...
... 
{% endfor %}    

查看页面源结果

<select name="status" required id="id_status">
  <option value="" selected>Select a Status</option>

  <option value="9">Acknowledged</option>

  <option value="12">General status update</option>

  <option value="2">In Progress (assessment and diagnostics)</option>

  <option value="10">In Progress (repairs/remedial action)</option>

  <option value="3">Pending (awaiting feedback from requestor)</option>

  <option value="5">Pending (awaiting parts/tools)</option>

  <option value="4">Pending (call logged with service provider)</option>

  <option value="7">Resolved</option>

</select>

对于 for 循环的所有迭代,上面的结果都是相同的,因为每个下拉列表都与它自己的任务相关联。 可以看出生成的 ID 是 id="id_status"。 这是我试图为每个下拉菜单设置的唯一值

编辑:为 formset 添加了尝试代码。 唯一的变化是 views.py 和 html 模板

我暂时将其作为答案,因为评论太长了,然后我将删除/调整它。

如果我正确理解您的要求,那么您不需要 IncidentStatus 的表单集,实际上您可能根本不需要 IncidentStatus model。 您似乎有大约 10-15 种不同的状态选择,因此您可以只在您的Incident model 中使用选择。然后您可以使用formset ,特别是modelformset ,但不是用于IncidentStatus ,而是用于Incident 然后你不需要迭代,表单集工厂将为事件 model 中的每个 object 创建一个新表单,具有自己的表单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM