【问题标题】:How to exclude django form field from render but still keep it for validation?如何从渲染中排除 django 表单字段但仍保留它以进行验证?
【发布时间】:2016-07-22 23:27:35
【问题描述】:

如果我有模型(摘录):

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 }} 时,图像字段仍然呈现。如果我从表单类中删除该字段的显式声明,则它不会呈现,但我没有获得表单验证和轻松将模型表单插入数据库的好处。我想为这个字段使用我自己的小部件(FileInput 很难看) - 我是否必须自己编写所有的 html,或者有没有办法使用as_table

【问题讨论】:

  • 好吧,那就不要使用form.as_table了。
  • 所以没有办法渲染表格并从渲染中排除字段而不是从表单中排除?

标签: django forms


【解决方案1】:

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

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

优于手动写出所有字段。

【讨论】:

  • 检查时不要忘记叫名字。 {% if field.name != "image" %}
【解决方案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)

【讨论】:

    【解决方案3】:

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

    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}}。

    【讨论】:

      【解决方案4】:

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

      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

      【讨论】:

        猜你喜欢
        • 2020-12-03
        • 2018-10-10
        • 2011-09-21
        • 2023-03-15
        • 1970-01-01
        • 2011-10-17
        • 2021-12-10
        • 2013-07-18
        • 2015-02-23
        相关资源
        最近更新 更多