Django在表单编辑时自动生成唯一字段失败验证

时间:2017-03-27 04:57:03

标签: python django forms

我正在尝试重用我的创建表单(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 = ()

有什么想法吗?

1 个答案:

答案 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 %}