[英]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.