如何从渲染中排除django表单字段但仍保留它以进行验证?

时间:2016-04-03 12:29:21

标签: django forms

如果我有模型(摘录):

two 997365
three 312355675

表格(摘录):

class Coupon(models.Model):
    image = models.ImageField(max_length=64, null=True, upload_to="couponimages")

然后我注意到当我class InsertCoupon(forms.ModelForm): image=forms.ImageField( required=False, #note explicitly declared false max_length=64, widget=forms.FileInput() ) class Meta: model=Coupon, exclude = ("image",) 时仍然呈现图像区域。如果我从表单类中删除字段的显式声明,那么它不会呈现,但我没有得到表单验证和简单模型插入到数据库的好处。我想在这个字段中使用我自己的小部件({{ form.as_table }}很难看) - 我是否必须自己编写所有html代码,或者有没有办法使用FileInput

4 个答案:

答案 0 :(得分:2)

因此,在模板中仅排除单个字段的更好方法可能是:

<table>
{% for field in form %}
    {% if field != "image" %}
    <tr><td>{{ field }}</td></tr>
    {% endif %}
{% endfor %}
</table>

手动写出所有字段。

答案 1 :(得分:2)

执行此处要执行的操作的最佳方法是编写自定义窗口小部件,以不同方式显示文件字段。但是,无需在模板中手动呈现表单即可回答您提出的确切问题的最佳方法是覆盖表单的as_table方法:

class InsertCoupon(forms.ModelForm):

    def as_table(self, *args, **kwargs):
        del self.fields['image']
        return super(InsertCoupon, self).as_table(*args, **kwargs)

答案 2 :(得分:1)

我认为实现此目标的最佳方法是创建一个不渲染任何内容的小部件:

class NoInput(forms.Widget):
    input_type = "hidden"
    template_name = ""

    def render(self, name, value, attrs=None, renderer=None):
        return ""

class YourForm(forms.Form):
    control = forms.CharField(required=False, widget=NoInput)

这样,您仍然可以在模板中使用{{form}}。

答案 3 :(得分:0)

您可以像这样手动渲染表单:

views.py

中的

return render(request, 'template.html', {'form': form})
template.html

中的

<form action="/your-name/" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.field1 }}
    {{ form.field2 }}
          .
          .
          .
    <input type="submit" value="Submit" />
</form>

另请查看Working with forms