2016-12-24 55 views
-1

在我的Django应用程序在CreateView的类它从未进入is_valid():声明,我似乎无法找到任何错误: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'), 
] 
+0

你在响应中是否有错误(即:'form.errors'有数据)? – martinarroyo

+0

不,如果我打印(len(form.errors))我得到零 –

+0

@LukeCollins看起来像'PostCreate'代码不完整/令人困惑,你的表单检查代码是在一个类def? –

回答

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开始比较容易,因为代码的流程更容易遵循。

+0

我已经更改为基于功能的视图。 –

+0

在我的模型中,我有一个“face”字段,我想要改变用户上传时发生的某些事情的价值,但我似乎无法改变它的价值?任何想法 –

+0

用'instance = form.save(commit = False)'保存表单后,在调用'instance.save()'之前改变'instance.face'的值。如果你仍然陷入困境,最好问一个新问题,因为这是一个不同的问题。 – Alasdair