Проверка формы Django в версии 1.2.1 - PullRequest
0 голосов
/ 02 июля 2010

Я использую django-закладки для одного из моих проектов и недавно обновлен до Django 1.2.1. Я заметил, что форма отправки не проверяется с момента обновления. Обратите внимание, что я подтвердил, что это работает с Django v1.1.1, поэтому новая версия и проверка полей формы отличаются.

Это модель, из которой формируется файл forms.py:

class BookmarkInstance(models.Model):

    bookmark = models.ForeignKey(Bookmark, related_name="saved_instances", verbose_name=_('bookmark'))
    user = models.ForeignKey(User, related_name="saved_bookmarks", verbose_name=_('user'))
    saved = models.DateTimeField(_('saved'), default=datetime.now)

    description = models.CharField(_('description'), max_length=100)
    note = models.TextField(_('note'), blank=True)

Вид обработки POST:

if request.method == "POST":
    bookmark_form = BookmarkInstanceForm(request.user, request.POST)
    if bookmark_form.is_valid():
        bookmark_instance = bookmark_form.save(commit=False)
        bookmark_instance.user = request.user
        bookmark_instance.save()
        bookmark = bookmark_instance.bookmark
        ...

И форм.py:

class BookmarkInstanceForm(forms.ModelForm):

    url = forms.URLField(label = "URL", verify_exists=True, widget=forms.TextInput(attrs={"size": 40}))
    description = forms.CharField(max_length=100, widget=forms.TextInput(attrs={"size": 40}))
    redirect = forms.BooleanField(label="Redirect", required=False)
    tags = TagField(label="Tags", required=False)

    def __init__(self, user=None, *args, **kwargs):
        self.user = user
        super(BookmarkInstanceForm, self).__init__(*args, **kwargs)
        # hack to order fields
        self.fields.keyOrder = ['url', 'description', 'note', 'redirect']

    def clean(self):
        if 'url' not in self.cleaned_data:
            return
        if BookmarkInstance.objects.filter(bookmark__url=self.cleaned_data['url'], user=self.user).count() > 0:
        raise forms.ValidationError(_("You have already bookmarked this link."))
        return self.cleaned_data

    ...    

    def save(self, commit=True):
        self.instance.url = self.cleaned_data['url']
        return super(BookmarkInstanceForm, self).save(commit)

    class Meta:
        model = BookmarkInstance
        #fields = ('url', 'description', 'note', 'redirect')

Используя pdb, я увидел, что значения внешнего ключа для BookmarkInstance были пусты, поэтому is_valid () вернул бы false, поскольку все поля не были проверены.

Нужно ли модифицировать функцию init для явной передачи параметров внешнего ключа? Разве значения внешнего ключа не должны передаваться автоматически, как это было в v1.1.1?

1 Ответ

0 голосов
/ 02 июля 2010

Я на самом деле просто решил это, и это было невероятно легко.Просто раскомментируйте:

#fields = ('url', 'description', 'note', 'redirect')

, так как для этого нужно явно указать поля.Это работало с Django v1.1.1, и я полагаю, что для новой проверки формы необходимо, чтобы это было явно указано в v1.2.1.

...