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

Esc*_*her 4 forms django

如果我有一个模型(摘录):

class Coupon(models.Model):
    image = models.ImageField(max_length=64, null=True, upload_to="couponimages")
Run Code Online (Sandbox Code Playgroud)

和一个表格(摘录):

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",)
Run Code Online (Sandbox Code Playgroud)

然后我注意到当我这样做时图像字段仍然呈现{{ form.as_table }}。如果我从表单类中删除字段的显式声明,则它不会呈现,但我不会从表单验证和简单的模型表单插入到数据库中获益。我想在这个领域使用我自己的小部件(FileInput很难看) - 因此我必须自己编写所有的 html,还是有办法使用as_table

Hub*_*yja 7

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

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)
Run Code Online (Sandbox Code Playgroud)

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


Esc*_*her 5

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

<table>
{% for field in form %}
    {% if field != "image" %}
    <tr><td>{{ field }}</td></tr>
    {% endif %}
{% endfor %}
</table>
Run Code Online (Sandbox Code Playgroud)

Beats 手动写出所有字段。


klo*_*ant 5

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

class InsertCoupon(forms.ModelForm):

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