【问题标题】:Django Form Validation in v1.2.1v1.2.1 中的 Django 表单验证
【发布时间】:2010-07-02 16:31:53
【问题描述】:

我在我的一个项目中使用 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 中那样自动传入吗?

【问题讨论】:

    标签: django validation forms bookmarks


    【解决方案1】:

    我实际上刚刚解决了它,而且非常容易。只需取消注释:

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

    因为它需要明确说明字段。这适用于 Django v1.1.1,我猜新表单验证需要在 v1.2.1 中明确说明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-10
      • 2011-01-19
      • 2021-06-05
      • 1970-01-01
      • 2014-12-06
      • 2017-08-24
      • 2019-02-02
      • 2020-06-10
      相关资源
      最近更新 更多