问题描述
我有一个简单的模型定义为:
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楼
我不认为你实际上是在更新现有的文章,而是创建一个新的文章,大概是或多或少相同的内容,特别是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所说,你应该使用你想要更新的对象来实例化你的模型表单,否则你将得到一个新表单。
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,因为数据库中某处已存在null / blank slug,它给出了“已存在”错误。 看起来你的slug字段根本没有正确保存。