django modelformset_工厂正在向我的modelforms添加一个伪造的“id”字段,我希望它停止

django modelformset_工厂正在向我的modelforms添加一个伪造的“id”字段,我希望它停止,django,django-forms,Django,Django Forms,正如标题所述,使用modelformset_factory生成一组modelforms,它似乎向每个表单添加了一个附加的选择字段,标记为“id”。我想阻止这一切 [编辑:我在下面发布了一个解决方案,但这肯定是一个黑客行为。如果有合适的方法来抑制这种行为,我非常想知道。如果没有,我不介意找出不这样做的原因。] 以下是表单集的代码: from models import ArticlesTemplate class ExistingTemplateForm(ModelForm): selec

正如标题所述,使用modelformset_factory生成一组modelforms,它似乎向每个表单添加了一个附加的选择字段,标记为“id”。我想阻止这一切

[编辑:我在下面发布了一个解决方案,但这肯定是一个黑客行为。如果有合适的方法来抑制这种行为,我非常想知道。如果没有,我不介意找出不这样做的原因。]

以下是表单集的代码:

from models import ArticlesTemplate
class ExistingTemplateForm(ModelForm):
    selected = forms.BooleanField(required=False, initial=False, widget=forms.RadioSelect(), label = 'use?')
    class Meta:
        model =  ArticlesTemplate
        exclude = ('template_file', 'organisation_for', 'mime_type', 'id', 'pk',)


ExistingTemplateFormset = modelformset_factory(ArticlesTemplate, extra = 0, form=ExistingTemplateForm)
In [24]: print etf

<input type="hidden" name="form-TOTAL_FORMS" value="1" id="id_form-TOTAL_FORMS" /><input type="hidden" name="form-INITIAL_FORMS" value="1" id="id_form-INITIAL_F
ORMS" /><input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS" />
<tr><th><span id="for-id_form-0-original_filename-">Original filename:</span></th><td><input id="id_form-0-original_filename" type="text" name="form-0-original_
filename" value="FakeExampleCompanyName.docx" maxlength="100" /></td></tr>
<tr><th><span id="for-id_form-0-tags-">Tags:</span></th><td><input type="text" name="form-0-tags" value="&quot;England and Wales&quot;, &quot;Model articles wit
h amendments&quot;, &quot;Private company limited by shares&quot;" id="id_form-0-tags" /><br /><span class="helptext">A comma-separated list of tags.</span></td
></tr>
<tr id="selected_row" class="selected_row "><th><span id="for-id_form-0-selected_0-">use?</span></th><td><ul>

</ul></td></tr>
<tr><th><span id="for-id_form-0-id-">Id:</span></th><td><select name="form-0-id" id="id_form-0-id">
<option value="" selected="selected">---------</option>
<option value="1">ArticlesTemplate object</option>
</select></td></tr>
请注意,将exclude='id'添加到modelformset_工厂调用并不阻止添加此字段

这是modelform自己生成的html:

In [15]: print i_h.ExistingTemplateForm()
<tr><th><span id="for-id_original_filename-">Original filename:</span></th><td><input id="id_original_filename" type="text" name="original_filename" maxlength="100" /></td></tr>
<tr><th><span id="for-id_tags-">Tags:</span></th><td><input type="text" name="tags" id="id_tags" /><br /><span class="helptext">A comma-separated list of tags.<
/span></td></tr>
<tr id="selected_row" class="selected_row "><th><span id="for-id_selected_0-">use?</span></th><td><ul>

</ul></td></tr>

正如你所看到的,最后有一个select元素,我没有要求它。

这是我找到的解决方案,我承认它并不完全令人满意:

class ExistingTemplateFormset(modelformset_factory(ArticlesTemplate, extra = 0, form=ExistingTemplateForm)):
    def __init__(self, *args, **kwargs):
        super(ExistingTemplateFormset, self).__init__(*args, **kwargs)
        for x in self: x.fields['id'].widget = forms.HiddenInput()
令我惊讶的是,这是一个不起作用的解决方案:

class ExistingTemplateForm(ModelForm):
    selected = forms.BooleanField(required=False, initial=False, row_renderer = default_renderer, widget=forms.RadioSelect(), label = 'use?')
    id = forms.ModelChoiceField(widget = forms.HiddenInput(), queryset = ArticlesTemplate.objects.all())
    class Meta:
        model =  ArticlesTemplate
        exclude = ('template_file', 'organisation_for', 'mime_type',)
## This __init__ has no effect on the widget used to render id
    def __init__(self, *args, **kwargs):
        super(ExistingTemplateForm, self).__init__(*args, **kwargs)
        self.fields['id'] = forms.ModelChoiceField(widget = forms.HiddenInput(), queryset = ArticlesTemplate.objects.all())
        self.fields['id'].widget = forms.HiddenInput()

我也没有办法解决这个问题。但我找到了一个解决办法:

我将不带标签的id字段呈现为带有标记{{form.id}的隐藏字段。例如,输出为:

但是如果使用{{formset}}或 {formset%中表单的%s} {{form}} {%endfor%}

您将成为id字段前面的可见标签


我希望我能帮助您使用form.visible\u字段

例如:


令人惊叹的我想这也不是什么新功能。
            {% for form in formset %}
                {% for field in form.visible_fields %}
                    {{ field.label_tag }} {{ field }}
                {% endfor %}
            {% endfor %}