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