我正在尝试重用我的创建表单(EntryForm)来编辑Django中的模型。我的Entry模型有一个独特的slug,在保存时生成。这在创建条目时工作正常,但在我尝试编辑时显示以下错误:
此Slug的输入已经存在。
我看到了几个类似的问题,但大多数都没有在实例化表单时设置instance=
。我非常确定我正确地做了那部分。
为了清楚起见,我已从下面的代码中删除了其他模型字段。
这是我的模特:
class Entry(models.Model):
title = models.CharField(max_length=128, blank=True)
slug = models.SlugField(unique=True, blank=True)
def save(self, *args, **kwargs):
if not self.title:
self.title = self.date.strftime('%B %-d, %Y')
self.slug = slugify(self.title)
super(Entry, self).save(*args, **kwargs)
我的观点:
def edit_entry(request, entry_slug):
entry = get_object_or_404(Entry, slug=entry_slug)
form = EntryForm(instance=entry, label_suffix='')
if request.method == 'POST':
form = EntryForm(request.POST, instance=entry, label_suffix='')
if form.is_valid():
form.save(commit=True)
return index(request)
else:
print(form.errors)
return render(request, 'journal/entry/form.html', {'form': form})
我的表格:
class EntryForm(forms.ModelForm):
title = forms.CharField(required=False, max_length=128, label="Title (defaults to date)")
slug = forms.CharField(widget=forms.HiddenInput(), required=False)
class Meta:
model = Entry
exclude = ()
有什么想法吗?
答案 0 :(得分:0)
我终于搞清楚了。
问题源于我正在重复使用我的创建模板进行编辑表单,但忘记根据我想要的操作动态设置表单操作。因此,我的“编辑”表单正确呈现,但实际上是通过“创建”操作提交的。
感谢那些评论和最终导致我调试问题的人,这个handy code snippet相当于Ruby的binding.pry
:
import code; code.interact(local=dict(globals(), **locals()))
我也接受了@ xyres的建议并从我的表格中删除了slug,因为这是不必要的。
新表格:
class EntryForm(forms.ModelForm):
title = forms.CharField(required=False, max_length=128, label="Title (defaults to date)")
class Meta:
model = Entry
exclude = ['slug']
edit_entry()
的新最后一行:
return render(request, 'journal/entry/form.html', {'form': form, 'entry': entry})
表格行动:
{% if entry %}
<form id="entry_form" method="post" action="/journal/entry/{{ entry.slug }}/edit">
{% else %}
<form id="entry_form" method="post" action="/journal/new_entry/">
{% endif %}