0

プロジェクトの 1 つで django-bookmarks を使用しており、最近 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
        ...

そしてforms.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 で行っていたように、外部キーの値が自動的に渡されるべきではありませんか?

4

1 に答える 1

0

私は実際にそれを解決しただけで、恥ずかしいほど簡単でした。以下のコメントを外すだけです:

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

フィールドを明示的に記述する必要があるためです。これは Django v1.1.1 で機能し、新しいフォーム検証には v1.2.1 で明示的に記述されている必要があると思います。

于 2010-07-02T19:15:02.187 に答える