首页 > 解决方案 > Django - 由于表单字段为空,表单返回无效

问题描述

在我的项目中,我有一个 Django 表单,它由一个ImageField和一个CharField组成。我将此表单传递给我的模板,并显示它。在表单上,​​我将方法属性设置为POST。在我看来,我处理这个请求,并返回一个重定向作为回报。

但是在我看来form.is_valid()又回来了,我在控制台中打印了表单错误。False

这是从返回的错误form.errors

<ul class="errorlist"><li>image<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

它说我的ImageField输入字段是空的,但是我肯定在浏览器中为ImageField选择了一个文件,因此我不知道为什么它说输入字段是空白的。我的代码如下。

表格.py:

    class CreatePost(forms.Form):
        // The field that is not being assigned a file 
        image = forms.ImageField(allow_empty_file=False, required=True, widget=forms.FileInput(attrs={'id': 'image'}))
        description = forms.CharField(max_length=100, required=False, widget=forms.TextInput(attrs={'placeholder': 'Add a caption:', 'id': 'description'}))

视图.py

def create(request):
    context = {}
    if request.method == "POST":
        form = CreatePost(request.POST)
        if form.is_valid():
            print("YES")
            return redirect('home')
        else:
            print(form.errors)
            context['error'] = 'Please enter valid form data'
    else:
        form = CreatePost()

    context['form'] = form
    return render(request, 'create.html', context)

模板

<form action="{% url 'create' %}" method="POST">
                {% csrf_token %}
                {% for field in form %}
                    {{ field }}
                    <br>
                {% endfor %}
                <button class="createBtn btn btn-primary" type="submit">Post</button>
</form>

有人知道这里的问题吗?谢谢你。

标签: django

解决方案


这里有两个问题:

  1. 您需要同时传递 request.POST request.FILES表单:

    form = CreatePost(request.POST, request.FILES)
  2. 为了让表单同时提交文件和字段,您需要将编码类型指定为"multipart/form-data"

    <form action="{% url 'create' %}" method="POST" enctype="multipart/form-data">

推荐阅读