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

Python Django表单在唯一字段上的验证失败,python,django,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 当我尝试更新现有行时,此

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

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

我所能猜到的是,您正在获取一个对象来填充表单,并试图再次保存它


尝试使用ModelForm,并使用所需对象对其进行提示。

您的SlugField似乎没有返回任何值,并且由于数据库中的某个位置已经存在空/空slug,因此会出现“已存在”错误。看起来您的slug字段根本没有正确保存。

我认为您实际上不是在更新现有文章,而是在创建一篇新文章,内容大致相同,尤其是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所指出的,你应该用你想要更新的对象实例化你的模型表单,否则你会得到一个新的。

我也在寻找更新现有记录的方法,甚至尝试了
form.save(force\u update=True)
但是收到了错误?? 最后通过尝试和错误管理来更新现有记录。以下代码测试工作正常。希望这有助于

djangobook中的models.py 更新现有记录
请编辑并发布您的表单代码。事实上,我发现标签上没有。一旦我添加了label='slug',消息就变成了{'slug':[u'Article with this slug已经存在。]}对,我做了一个变体。因此,一旦我分配了我所处理的文章的一个实例,它就会进行验证。否则Django想要创建一个新对象。
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})