Django表单没有通过is_valid()测试

时间:2016-12-24 15:08:48

标签: python django forms

在我的Createview类的Django应用程序中,它永远不会输入is_valid():语句,我似乎无法找到任何错误:

models.py

from django.db import models
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
from django.conf import settings
from .validators import validate_file_extension
import zipfile
class Post(models.Model):
    title = models.CharField(max_length=140) 
    body = models.TextField(max_length=250)
    date = models.DateTimeField(auto_now=True, auto_now_add=False)
    album_image = models.FileField(validators=[validate_file_extension])
    user = models.ForeignKey(User, default=1)
    face = models.IntegerField(default=1)   

    def get_absolute_url(self):
        return reverse('photos:detail',kwargs={'pk':self.pk})

    def __str__(self):
        return self.title

views.py

这是我的视图文件夹,其中包含列表视图的详细视图和创建视图。虽然表单没有通过有效测试,但它仍然可以上传并且可由用户查看

from django.http import Http404
from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404
from django.core.urlresolvers import reverse
from .forms import PostForm
from .models import Post
from django.contrib.auth.models import User
from django.template import loader
from django.views import generic
from django.views.generic.edit import CreateView
import cognitive_face as CF
import json

class IndexView(generic.ListView):
    template_name='photos/post.html'
    def get_queryset(self):
        return Post.objects.filter(user=self.request.user)

class DetailView(generic.DetailView):
    model = Post
    template_name = 'photos/detail.html'

class PostCreate(generic.CreateView):
    form = PostForm()
    model = Post

    if form.is_valid():
        print('valid')
        instance = form.save(commit=False)
        username = form.cleaned_data['username']
        album_image = form.cleaned_data['album_image']

        instance.save()
    if not form.is_valid():
        print('not')

post_form.html

<html>
<body>
{% if request.user.is_authenticated%}
<h3>Hello {{request.user.username}}, please upload your image as either a .JPEG, .GIF or .PNG</h3>
{% endif %}
<div class="container-fluid">

    <div class="row">

        <div class="col-sm-12 col-md-7">
            <div class="panel panel-default">
                <div class="panel-body">
                   {% if request.user.is_authenticated %}
             <form class="form-horizontal" role="form" action="" method="post" enctype="multipart/form-data">
                        {% csrf_token %}
                {{form.as_p}}
                {{ form.errors }}
{{ form.non_field_errors }}
                            <div class="col-sm-offset-2 col-sm-10">
                                <button type="submit" class="btn btn-success">Submit</button>
                            </div>
                        </div>
                    </form>
        {% else %}
        <p>You must be logged in to upload a file</p>
                {% endif %}
        </div>
            </div>
        </div>
</body>

</html>

urls.py

from django.conf.urls import url, include
from django.views.generic import ListView, DetailView
from photos.models import Post
from . import views

app_name = 'photos'

urlpatterns = [
    url(r'^$',views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)/$',views.DetailView.as_view(), name='detail'),
    url(r'post/add/$', views.PostCreate.as_view(), name='post-add'),
]

1 个答案:

答案 0 :(得分:1)

您正在基于类的视图中编写基于函数的视图代码,这是不正确的。

您不需要实例化表单,也不需要手动检查表单是否有效。只需为视图设置form_class,如果您需要在表单有效或无效时更改行为,请覆盖form_validform_invalid。由于您的模板中有{{ form.errors }},因此在提交表单时应显示任何错误。

class PostCreate(generic.CreateView):
    form_class = PostForm
    model = Post

有关详细信息,请参阅form handling with class based views上的文档。您可能会发现编写function based view更容易,因为代码流更容易遵循。