我有一个特殊的问题涉及使用m2m字段编辑模型,我似乎无法在任何地方找到答案。所以我有一个模型,Equipment
与Tests
的m2m关系。
models.py:
class Equipment(models.Model):
...
tests = models.ManyToManyField(Test, blank=True)
def __str__(self):
return '%s %s' % (self.manufacturer, self.model)
pass
forms.py:
class EquipmentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
modality = kwargs.pop('modality', None)
super (EquipmentForm, self).__init__(*args, **kwargs)
self.fields['tests'].widget = forms.CheckboxSelectMultiple()
self.fields['tests'].queryset = Test.objects.filter(modality=modality).order_by('group', 'number')
class Meta:
model = Equipment
fields = ['tests']
html:
...
<tbody>
{% for f in form.tests %}
<tr>
<td>{{ f }}</td>
<td>
<a data-toggle="modal" href="{% url 'app:modal' equipament_id=equipament_id test_id=f.id %}" data-target="#tests">See</a>
</td>
</tr>
{% endfor %}
</tbody>
如您所见,我正在尝试为表单中的每个测试字段打开一个模态,以便用户可以看到与该测试相关的一些信息。这是我遇到麻烦的地方,因为我似乎无法将f.id传递给呈现模式对话框的视图。有关如何做到这一点的任何想法?请帮忙。
首次尝试
{% for field in form.visible_fields %}
{% if field.name == "tests" %}
<table>
{% for choice in field.queryset %}
<tr>
<td><input value="{{choice.id}}" type="radio" name="tests" />{{choice.description}}</td>
</tr>
{% endfor %}
</table>
{% endif %}
{% endfor %}
由于查询集,这不起作用。从文档来看,ModelMultipleChoiceField不支持。
第二次尝试
<table>
<tbody>
{% for pk, choice in form.tests.field.choices %}
<tr>
<td>{{ choice }}</td>
<td><a data-toggle="modal" href="{% url 'SFM:modal' equipment_id=equipment_id test_id=pk %}" data-target="#tests">Ver</a></td>
</tr>
{% endfor %}
</tbody>
</table>
使用这种方法,我能够将pk传递给视图并加载相应的模态,但我丢失了我的表单复选框。如果我手动渲染它,我无法保存任何复选框。这告诉我可以将pk传递给视图,但也许它可以通过查询字段形式而不仅仅是在选择中来访问。我的想法已经不多了。