2012-01-02 64 views
3

在我的django应用程序中,即使添加与管理应用程序中相同的数据,表单永远不会返回true。我model.py样子:Django表单is_valid始终为假

from django.db import models 
from django.db.models import ImageField, signals 
from django.dispatch import dispatcher 
from django.forms import ModelForm 

# Create your models here. 
class Image(models.Model): 
    emailAddress = models.EmailField(max_length=75) 
    image = ImageField(upload_to='photos') 
    caption = models.CharField(max_length=100) 

class UploadForm(ModelForm): 
    class Meta: 
     model = Image 

我views.py看起来像:

from django.http import HttpResponse, HttpResponseRedirect 
from django.shortcuts import render_to_response 
from competition.models import Image, UploadForm 

# Create your views here. 

def index(request): 
    images = Image.objects.all().order_by('emailAddress') 
    return render_to_response('images/index.html', {'images': images}) 

def uploadImage(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = UploadForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      emailAddress = form.cleaned_data['emailAddress'] 
      image = form.cleaned_data['image'] 
      caption = form.cleaned_data['caption'] 
      i = Image(emailAddress=emailAddress, image = image, caption = caption) 
      i.save() 
      return HttpResponseRedirect('../image/') 
     else: 
      return render_to_response('images/upload.html', {'form': form}) 
    else: 
     form = UploadForm() # An unbound form 
     return render_to_response('images/upload.html', {'form': form}) 

我的模板是这样的:

<html> 
<body> 
    <form enctype="multipart/form-data" action="/image/uploadImage" method="post">{% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Submit" /> 
    </form> 
    </body> 
</html> 

我可以得到它正常工作,如果我使用管理员应用程序,但需要一个通用的形式,这不起作用,因为它不断要求电子邮件地址或图像(错误出现在图像字段上方)。那么为什么我的表单可能无效?

+2

添加CSRF令牌的形式。 – 2012-01-02 15:31:38

+0

@Cat Plus Plus,我添加了CSRF令牌,错误仍在发生。为什么这会有所作为?我认为is_valid的想法是检查数据的有效性。 – Dean 2012-01-02 15:41:48

回答

3

你需要用request.FILES和request.POST来实例化你的表单。

另外,您可以保存模型窗体,而不是在视图中手动创建图像。

+1

这没有很好记录。是的,我曾尝试过,但因为它没有工作,所以我现在就改变它。 – Dean 2012-01-02 15:55:13

+1

我的文档看起来很清楚。请记住,Django是一个开源项目。打开一张票,提出如何改进文档的建议比在堆栈溢出评论中批评它更有建设性。 – Alasdair 2012-01-02 17:46:06