【问题标题】:Django form fails validation on a unique fieldDjango 表单在唯一字段上验证失败
【发布时间】:2023-04-06 09:36:01
【问题描述】:

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

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() 在表单初始化时调用。

【问题讨论】:

  • 请编辑并发布您的表单代码。

标签: python django


【解决方案1】:

我不认为您实际上是在更新现有文章,而是创建一个新文章,大概具有或多或少相同的内容,尤其是 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 所说,您应该使用要更新的对象来实例化您的模型表单,否则您将获得一个新的。

【讨论】:

  • 对,我做了一个变体。因此,一旦我分配了我正在处理的文章的实例,它就会验证。否则 Django 想要创建一个新对象。
【解决方案2】:

我也在寻找更新现有记录的方法,甚至尝试过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})

【讨论】:

    【解决方案3】:

    我能猜到的是,您正在获取一个对象来填写表格,并尝试再次保存它。

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

    【讨论】:

      【解决方案4】:

      看来您的 SlugField 正在返回 None 并且因为空/空白 slug 已经存在于数据库中的某处,它给出了“已经存在”错误。您的 slug 字段似乎根本没有正确保存。

      【讨论】:

      • 其实我发现None是标签。添加 label='slug' 后,消息变为 {'slug': [u'Article with this slug already exists.']}
      猜你喜欢
      • 2011-01-26
      • 2011-08-07
      • 1970-01-01
      • 2017-01-25
      • 2014-10-10
      • 1970-01-01
      • 2021-02-25
      • 2020-03-05
      • 2014-04-18
      相关资源
      最近更新 更多