Django表单在唯一字段上验证失败

时间:2009-02-08 21:36:23

标签: python django

我有一个简单的模型定义为:

class Article(models.Model):
    slug  = models.SlugField(max_length=50,  unique=True)
    title = models.CharField(max_length=100, unique=False)

和表格:

class ArticleForm(ModelForm):
    class Meta:
       model = Article

当我尝试更新现有行时,此处的验证失败:

 if request.method == 'POST':
     form = ArticleForm(request.POST)

     if form.is_valid(): # POOF
         form.save()

创建新条目很好,但是,当我尝试更新任何这些字段时,验证不再通过。

“errors”属性什么都没有,但是我进入了调试器并深入Django的内部,我看到了这个:

slug:“带有此条目的文章已经存在”

所以看起来is_valid()在唯一值检查上失败了,但我想做的就是更新该行。

我不能这样做:

form.save(force_update=True)

...因为表单在验证时会失败。

这看起来很简单,但我无法理解。

我正在运行Django 1.0.2

在表单初始化时调用了BaseModelForm.validate_unique()。

4 个答案:

答案 0 :(得分:26)

我认为您实际上并不是在更新现有文章,而是创建一个新文章,大概是或多或少相同的内容,尤其是slug,因此您将收到错误。你没有得到更好的错误报告有点奇怪,但我也不知道你的视图的其余部分是什么样的。

如果您沿着这些方向尝试某些内容会怎么样(我已经包含了一些可能的视图功能,根据您的需要进行更改);我实际上没有测试过我的代码,所以我确信我至少犯了一个错误,但你至少应该得到一般的想法:

def article_update(request, id):
   article = get_objects_or_404(Article, pk=id)

   if request.method == 'POST':
      form = ArticleForm(request.POST, instance=article)

      if form.is_valid():
         form.save()

         return HttpResponseRedirect(to-some-suitable-url)

   else:
      form = ArticleForm(instance=article)

   return render_to_response('article_update.html', { 'form': form })

正如taurean所指出的那样,您应该使用您想要更新的对象来实例化您的模型表单,否则您将获得一个新表单。

答案 1 :(得分:4)

我还在寻找一种更新现有记录的方法,甚至试过form.save(force_update=True)但收到了错误? 最后通过试用&设法更新现有记录的错误。下面的代码测试工作。希望这会有所帮助...

来自djangobook的

models.py

class Author(models.Model):
    first_name = models.CharField(max_length=30)

    last_name = models.CharField(max_length=40)

    email = models.EmailField(blank=True, verbose_name='e-mail')

    objects = models.Manager()

    sel_objects=AuthorManager()

    def __unicode__(self):
        return self.first_name+' '+ self.last_name

class AuthorForm(ModelForm):
    class Meta:
        model = Author


# views.py
# add new record

def authorcontact(request):

    if request.method == 'POST':

        form = AuthorForm(request.POST)

        if form.is_valid():

            form.save()

            return HttpResponseRedirect('/contact/created')

    else:

        form = AuthorForm()

    return render_to_response('author_form.html', {'form': form})

更新现有记录

def authorcontactupd(request,id):

    if request.method == 'POST':

        a=Author.objects.get(pk=int(id))

        form = AuthorForm(request.POST, instance=a)

        if form.is_valid():

            form.save()

            return HttpResponseRedirect('/contact/created')

    else:
        a=Author.objects.get(pk=int(id))

        form = AuthorForm(instance=a)

    return render_to_response('author_form.html', {'form': form})

答案 2 :(得分:2)

我可以猜到的是,您正在获取一个填充表单的对象,并尝试再次保存它。

尝试使用ModelForm,并使用所需的对象进行实例化。

答案 3 :(得分:1)

看来您的SlugField返回None并且因为数据库中某处已存在null / blank slug,所以它给出了“已存在”错误。看起来你的slug字段根本没有正确保存。