2017-10-15 8 views
0

私は基本的なCMSを構築しています。私はすべてのモデルオブジェクトに外部キーを持つプロジェクトIDを追加する組織アプリを作成しました。このフォームは、ヘッダとテキストを含む基本的なウェブサイトオブジェクトを作成するためのものです。次のコードを使用して1つのインスタンスを作成して保存することができました。 "(1062、"重複するエントリ ''のキー 'cms_page_url_117a950602ffab5c_uniq' ")外部キーとslug = slugifyでunique_togetherを持つDjangoは失敗します

私は間違っていると思っています。誰かが正しい方向で私を指し示すことができますか? 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

[OK]を、私は、システム内の不完全な移行を持っていた...それは情報「cms_page_url」から私には明らかにされている必要があります。以前のバージョンのモデルでは、私のモデルにURLというuniqフィールドがありましたが、これを削除しました。移行が不完全であったため、これはデータベースに残っており、エラーが発生していました。 (IntegrityErrorsはdjangoではなく、基底のデータベースから来ます)。

私の推論と上記のコードは、将来誰かに役立つことを願っています。

関連する問題