Проверка объектов в Django с несколькими формами - PullRequest
1 голос
/ 08 ноября 2010

Использование в этом примере . Представьте, что в обеих формах есть поля даты. Как бы вы написали собственную чистку для проверки, чтобы сравнить обе даты? Я добавил чистый пример внизу, который возвращает ключевую ошибку при опросе.

модели и формы

from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField()
    target_date= models.DataTimeField()

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    target_date= models.DataTimeField()
    votes = models.IntegerField(default=0)
To start, we’ll need forms for each model.

from django import forms
from mysite.polls.models import Poll, Choice

class PollForm(forms.ModelForm):
    class Meta:
        model = Poll

class ChoiceForm(forms.ModelForm):
    class Meta:
        model = Choice
        exclude = ('poll',)

Просмотры

from mysite.polls.models import Poll, Choice
from mysite.polls.forms import PollForm, ChoiceForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response

def add_poll(request):
    if request.method == "POST":
        pform = PollForm(request.POST, instance=Poll())
        cforms = [ChoiceForm(request.POST, prefix=str(x), instance=Choice()) for x in range(0,3)]
        if pform.is_valid() and all([cf.is_valid() for cf in cforms]):
            new_poll = pform.save()
            for cf in cforms:
                new_choice = cf.save(commit=False)
                new_choice.poll = new_poll
                new_choice.save()
            return HttpResponseRedirect('/polls/add/')
    else:
        pform = PollForm(instance=Poll())
        cforms = [ChoiceForm(prefix=str(x), instance=Choice()) for x in range(0,3)]
    return render_to_response('add_poll.html', {'poll_form': pform, 'choice_forms': cforms})

Пример чистого запуска в форме, который возвращает ключевую ошибку для опроса.

def clean(self):
        if any(self.errors):
            raise forms.ValidationError("")
        data = self.cleaned_data
        choiceDate = data["target_date"]
        pollDate = data["poll"]    ##--- The key error happens here
        if choiceDate > pollDate.target_date:
            raise forms.ValidationError("Your dates do not match")
        return data

1 Ответ

1 голос
/ 08 ноября 2010

pollDate = data["poll"] ##--- The key error happens here

Это потому, что в форме нет поля с именем poll, потому что вы явно исключаете его из определения формы. Я не могу сказать, что чистка, которую вы даете, находится на PollForm или ChoiceForm, но ни у одного нет поля poll.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...