在ModelForm

时间:2016-06-24 01:05:17

标签: django django-models django-forms django-templates

我有一个特殊的问题涉及使用m2m字段编辑模型,我似乎无法在任何地方找到答案。所以我有一个模型,EquipmentTests的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传递给视图,但也许它可以通过查询字段形式而不仅仅是在选择中来访问。我的想法已经不多了。

0 个答案:

没有答案