2011-02-22 50 views
0

我在製作表單時遇到了麻煩。正如我所看到的,一切都很好,但is_valid()總是返回False(我必須在shell模式下檢查它,因爲在模板中它不顯示任何錯誤)。我錯過了什麼嗎?無法通過圖像驗證django表單

如果有人想對它進行測試,可以從http://gitorious.org/e-cidadania

forms.py

from django.forms import ModelForm 
from e_cidadania.apps.spaces.models import Space 

class SpaceForm(ModelForm): 
    class Meta: 
     model = Space 

views.py

@permission_required('Space.add_space') 
def create_space(request): 

space = Space() 
if request.POST: 
    form = SpaceForm(request.POST, request.FILES, instance=space) 
    if form.is_valid(): 
     handle_uploaded_file(request.FILES['file']) 
     form.author = request.user 
     form.date = datetime.datetime.now() 
     form.save() 
     return render_to_response('/') 
else: 
    form = SpaceForm() 
return render_to_response('spaces/add.html', 
         {'form': form}, 
         context_instance=RequestContext(request)) 

models.py下載

class Space(models.Model): 

    name = models.CharField(_('Name'), max_length=100, unique=True, 
          help_text=_('All lowercase. Obligatory.')) 
    description = models.TextField(_('Description')) 
    date = models.DateTimeField(auto_now_add=True) 
    author = models.ForeignKey(User, verbose_name=_('Author')) 
    logo = models.ImageField(upload_to='spaces/logos', 
          verbose_name=_('Logotype'), 
          help_text=_('100px width, 75px height')) 
    banner = models.ImageField(upload_to='spaces/banners', 
           verbose_name=_('Banner'), 
           help_text=_('75px height')) 
    authorized_groups = models.ManyToManyField(Group, 
               verbose_name=_('Authorized groups')) 

    mod_debate = models.BooleanField(_('Debate module')) 
    mod_proposals = models.BooleanField(_('Proposals module')) 
    mod_news = models.BooleanField(_('News module')) 
    mod_cal = models.BooleanField(_('Calendar module')) 
    mod_docs = models.BooleanField(_('Documents module')) 

回答

1

的問題是,該模型領域作者和日期沒有宣佈爲空白=真,空=真。由於該表單從未經過驗證,因爲即使您未提交save(),save命令也會驗證表單。

1

form.errors顯示沒有錯誤?

當文件被捲入,檢查是否request.FILES實際上有一個文件。

確保您<form><form enctype="multipart/form-data" ...> ..這是在許多情況下罪魁禍首。

所有谷歌的結果爲錯誤圍繞PIL。特別是如果你在Mac上!

http://salamand.wordpress.com/2009/08/25/problem-uploading-image-file-to-satchmo/ http://djangodays.com/2008/09/03/django-imagefield-validation-error-caused-by-incorrect-pil-installation-on-mac/
http://mail.python.org/pipermail/image-sig/2002-August/001947.html

+0

是的,我宣佈它作爲一個多形式,和is_multipart()返回true。我還沒有嘗試過form.errors呢(對我很恥辱!) – 2011-02-22 19:49:54

+0

是的,讓我們看看錶單是否抱怨。 – 2011-02-22 20:40:11

0

虞姬可能回答你的問題,但我想就如何使視圖更清潔小費(同一個意思,少了幾分代碼的可讀性相同甚至更好):

@permission_required('Space.add_space') 
def create_space(request): 

    space = Space() 
    form = SpaceForm(request.POST or None, request.FILES or None, instance=space) 

    if request.POST and form.is_valid(): 
     handle_uploaded_file(request.FILES['file']) 
     form.author = request.user 
     form.date = datetime.datetime.now() 
     form.save() 
     return render_to_response('/') 

    return render_to_response('spaces/add.html', 
          {'form': form}, 
          context_instance=RequestContext(request)) 
0

我不知道這是否會幫助,但一旦當我檢查用戶的權限,即提交表單我得到了一些錯誤,這使得招:

if form.is_valid(): 
     new_space = form.save(commit = False) 
     new_space.author = request.user 
     ... 
     new_space.save()