外键上的unique_together和slug = slugify的Django失败

时间:2017-10-15 16:01:17

标签: mysql django django-models django-forms

我正在构建一个基本的CMS。我创建了一个组织应用程序,它将一个带有外键的项目ID添加到我的所有模型对象中。该表单用于创建带有标题和文本的基本网站对象。我能够使用以下代码创建并保存一个实例。使用不同标题的进一步尝试失败,并显示“(1062,”重复输入''用于键'cms_page_url_117a950602ffab5c_uniq'“)

我现在知道我哪里出错了,有人能指出我正确的方向吗?我在mysql数据库上运行。

型号:

class Page(models.Model):
    title = models.CharField(max_length=100)
    text = models.TextField(blank=True)

    slug = models.SlugField()

    date_created = models.DateTimeField(auto_now_add=True)
    last_modified = models.DateTimeField(default=timezone.now)

    project = models.ForeignKey(Project)

    def __unicode__(self):
        return "Page '%s' @: %s from %s" % (self.title, self.slug, self.project)

    def __str__(self):
        return unicode(self).encode('utf-8')

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Page, self).save(*args, **kwargs)

    class Meta:
        unique_together = (("project", "slug"),)

形式:

class PageForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(PageForm, self).__init__(*args, **kwargs)
        for key, field in six.iteritems(self.fields):
            field.widget.attrs['placeholder'] = field.label

    class Meta:
        model = Page
        fields = ['title', 'text']
        # TODO: ordering

    title = forms.CharField(max_length=100, label=ugettext_lazy("Add a title"))
    text = forms.CharField(label=ugettext_lazy("Type your text here"), widget=forms.Textarea)

    def save(self, project, commit=True):
        instance = super(PageForm, self).save(commit=False)
        instance.project = project

        if commit:
            instance.save()

        return instance

查看(CreateView):

class PagesCreateView(CreateView):
    success_url = reverse_lazy('guiWeb')
    form_class = PageForm
    template_name = 'cms/page_create.html'

    def form_valid(self, form):
        project = Project.objects.get(id=self.request.session['authority'])

    #Handle IntegrityError in view to avoid race condition.
    try:
        self.object = form.save(project=project)
    except IntegrityError:
        form.add_error('title', 'Page titles must be unique')
        return self.form_invalid(form)

    return HttpResponseRedirect(self.get_success_url())

这是最后一个错误陈述:

/usr/local/lib/python2.7/dist-packages/MySQL_python-1.2.4b4-py2.7-linux-x86_64.egg/MySQLdb/cursors.py in execute

                            self.errorhandler(self, exc, value)

     ...

▼ Local vars
Variable    Value
args    

[u'This is a new page 2',
 u'dffjghk',
 u'this-is-a-new-page-2',
 u'2017-10-15 15:37:18',
 u'2017-10-15 15:37:18',
 4]

exc     

<class '_mysql_exceptions.IntegrityError'>

self    

<MySQLdb.cursors.Cursor object at 0x7faa0dbbbb10>

charset     

'utf8'

db  

<weakproxy at 0x7faa0db87aa0 to Connection at 0x7faa0844c330>

value   

IntegrityError(1062, "Duplicate entry '' for key 'cms_page_url_117a950602ffab5c_uniq'")

r   

None

query   

"INSERT INTO `cms_page` (`title`, `text`, `slug`, `date_created`, `last_modified`, `project_id`) VALUES ('This is a new page 2', 'dffjghk', 'this-is-a-new-page-2', '2017-10-15 15:37:18', '2017-10-15 15:37:18', 4)"

1 个答案:

答案 0 :(得分:0)

好的,我在系统中有一个不完整的迁移......我应该从信息中清楚地看到&#34; cms_page_url&#34;。在模型的先前版本中,我在我的模型中有一个名为url的uniq字段,我将其删除。由于迁移不完整,因此仍然在数据库中并抛出错误。 (IntegrityErrors来自底层数据库,而不是django)。

我希望我的推理和上述代码对未来的人仍然有用。