当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Django表单在唯一字段上验证失败》经验,为你挑选了1个好方法。

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

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()

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

"错误"属性什么也没有,但我进入调试器并深入Django内部,我看到了这个:

slu ::"没有此条款的文章已经存在"

因此看起来is_valid()在唯一值检查上失败,但我想要做的就是更新行.

我不能这样做:

form.save(force_update=True)

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

这看起来很简单,但我无法弄清楚.

我正在运行Django 1.0.2

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



1> Johan..:

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

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有