Не удается проверить форму Django с изображениями - PullRequest
0 голосов
/ 22 февраля 2011

У меня проблемы с работой формы. На мой взгляд, все в порядке, но is_valid() всегда возвращает False (я должен был проверить это в режиме оболочки, поскольку в шаблоне он не показывает никаких ошибок). Я что-то упустил?

Если кто-то хочет проверить его, его можно загрузить с 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'))

Ответы [ 4 ]

1 голос
/ 18 марта 2011

Проблема заключалась в том, что автор модели поля и дата не были объявлены как пустые = True, null = True.Из-за этого форма никогда не проверялась, потому что даже если вы не передали save (), команда save действительно проверяет форму.

1 голос
/ 22 февраля 2011

form.errors не показывает ошибок?

Когда речь идет о файлах, проверьте, есть ли у request.FILES файл.

Убедитесь, что у вашего <form> есть <form enctype="multipart/form-data" ...> .. это виновник во многих случаях.

Все результаты Google для этой ошибки вращаются вокруг 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 голосов
/ 23 февраля 2011

Я не знаю, поможет ли это, но однажды у меня появилось несколько ошибок, когда я проверил разрешения для пользователя, которые отправляют форму, и это делает хитрость:

   if form.is_valid():
        new_space = form.save(commit = False)
        new_space.author = request.user
        ...
        new_space.save()
0 голосов
/ 22 февраля 2011

Юджи, вероятно, ответил на ваш вопрос, но я хотел бы дать совет о том, как сделать представление чище (то же самое, немного меньше кода и читаемость такие же или даже лучше):

@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)) 
...