【问题标题】:form.is_valid always return falseform.is_valid 总是返回 false
【发布时间】:2018-01-05 11:58:40
【问题描述】:

views.py 中的form.is_valid 总是返回 false。我已经使用 Django 表单创建了一个表单和 html 来实现它。

稍后我将使用 imgurpython 将这张照片上传到 imgur,但首先应该可以。

views.py

def upload_view(request):
usr = check_validation(request)

if usr:
    if request.method == "GET":
        form = PostForm()
        return render(request, 'upload.html', {'form': form})
    elif request.method == "POST":
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            pic = form.cleaned_data.get('image')
            title = form.cleaned_data.get('caption')
            post = PostForm()
            post.user = usr
            post.caption = title
            post.image = pic
            post.save()
            return redirect('feed/')
        else:
            return render(request, 'upload.html', {'error_msg' : "Invalid Inputs"})

else:
    return redirect('/login/')

models.py

class Post(models.Model):
    user = models.ForeignKey(User)
    image = models.FileField(upload_to='user_images')
    caption = models.CharField(max_length=240)
    image_url = models.CharField(max_length=255)
    created_on = models.DateTimeField(auto_now_add=True)

forms.py

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['user', 'image', 'caption']

模板 - upload.html

<form method="post" enctype="multipart/form-data" class="loginbox" style="margin-top:200px;">
    {% csrf_token %}
        <p class="text-16">Upload to aperture.</p>
    {{ form }}
    <p class="text-16">{{ error_msg }}</p>
    <input class="login-btn" type="submit" value="Upload"/>
  </form>

【问题讨论】:

标签: python django forms django-models imgur


【解决方案1】:

您的上下文只有一个名为form 的变量,因此您只能使用它来使您的表单工作。

<form method="post" enctype="multipart/form-data" class="loginbox" style="margin-top:200px;">
        {% csrf_token %}
            <p class="text-16">Upload to aperture.</p>
        <input type="file" accept="image/*" value="{{ form.image }}" name="image" class="login-btn"/><br/>
        <input placeholder="Caption" class="input-default all-curve" rows="3" value="{{ form.caption }}" name="caption" />
        <p class="text-16">{{ form.error_msg }}</p>
        <input class="login-btn" type="submit" value="Upload"/>
      </form>

【讨论】:

  • 我的 forms.py 不只有一种形式,有这么多,而且这种方法不起作用:(
  • @YogeshKumar 您的 image_url 字段导致了问题。您的表单没有发送此字段并且它是空的,这就是它无效的原因
  • 不应该是{{form}} 吗?可能是字段的名称与 Django 预期的名称不同?
  • 在元类中定义的所有字段都可以直接从模板中的表单对象访问。同样使用{{form}} 是正确的,但是OP 必须在表单中添加类和其他属性,因此他必须明确声明每个表单字段。 @SidhinThomas
  • 是的,这就是为什么我说他必须将每个属性添加到 PostForm 类中的每个表单字段。由于默认字段名称,上述一个也将始终有效。 @SidhinThomas
【解决方案2】:

试试这个,

<form method="post" enctype="multipart/form-data" class="loginbox" style="margin-top:200px;">
        {% csrf_token %}
        {{ form }}
        <input class="login-btn" type="submit" value="Upload"/>
</form>

如果这不起作用,请打印request.POSTrequest.FILES,然后使用内容更新答案。

【讨论】:

    猜你喜欢
    • 2014-12-27
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2014-01-10
    相关资源
    最近更新 更多