2009-02-08 89 views
17

我有一个被定义为一个简单的模型: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() 

创建新条目是好的,但是,当我尝试更新这些字段,确认不再经过。

的“错误”属性一无所有,但我投进调试程序并在我看到这个Django的胆量深:

毛坯:“文章本无已存在”

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

我不能只是做:

form.save(force_update=True) 

...因为形式将在验证失败。

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

我正在运行的Django 1.0.2

什么嘎嘎叫着是BaseModelForm.validate_unique()这就是所谓的形式初始化。

+1

请编辑和发布表单代码。 – Soviut 2009-02-08 21:50:24

回答

23

我不认为你实际上正在更新现有的文章,而是创建一个新的文章,推测其内容或多或少相同,尤其是slu and,因此你会得到一个错误。有一点奇怪,你没有得到更好的错误报告,但我也不知道你的观点的其他部分是什么样子。

如果你沿着这些路线尝试某些东西(我已经包含了更多的可能的视图功能,请根据需要进行更改);我没有实际测试我的代码,所以我相信我做了至少一个错误,但你至少应该得到的总体思路:

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

的事情是,因为金牛座指出,你应该实例你的模型形式与你想更新的对象,否则你会得到一个新的。

+0

对,我做了一些变化。因此,一旦我分配了我工作的文章的一个实例,它就会验证。否则,Django想要创建一个新对象。 – 2009-02-09 00:35:20

2

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

尝试使用ModelForm,并将其与所需对象进行比较。

1

看来你的SlugField返回None,并且因为null/blank slug已经存在于数据库的某个地方,所以它给出了一个'already exists'错误。看起来你的slug字段根本没有正确保存。

+0

其实我发现None是标签。一旦我添加了标签='slug',信息就变成{'slug':[u'这条slu already已经存在了。']} – 2009-02-09 00:20:11

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