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