2017-10-15 85 views
0

我正在构建一个基本的CMS。我创建了一个组织应用程序,它为我的所有模型对象添加了一个带有外键的项目ID。该表单用于创建具有标题和文本的基本网站对象。我能够用下面的代码创建并保存一个实例。有不同的称呼失败,并进一步尝试“(1062,‘‘关键‘cms_page_url_117a950602ffab5c_uniq重复条目’’’)Django与unique_together外键和slug = slugify失败

现在我知道在那里我错了,可有人点我在正确的方向吗?我正在上。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)" 

回答

0

好吧,我不得不在系统不完整的迁移......这应该是从信息“cms_page_url”我清楚。在模型的以前版本中,我的模型中有一个名为url的uniq字段,我删除了它。由于迁移不完整,这仍然存在于数据库中并引发错误。 (IntegrityErrors来自底层数据库,而不是django)。

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