2016-04-13 100 views
1

當我試圖創建一個新的Post對象,巨蟒裏噴出以下錯誤:Django的唯一約束失敗:webapp_post.slug

UNIQUE constraint failed: webapp_post.slug 

這裏是我的models.py

class Post(models.Model): 
    title = models.CharField(max_length=200) 
    slug = models.SlugField(unique=True) 
    text = models.TextField() 
    created_on = models.DateTimeField(auto_now_add=True) 
    up_vote = 0 # num of up votes 
    down_vote = 0 #num of down votes 
    vote_total = up_vote - down_vote 
    author = models.ForeignKey('auth.User', null=True, blank=True) 

    CHOICES = [ 
     ('Hardware and OS', 'Hardware and OS'), 
     ('Desktops', 'Desktops'), 
     ('Tablets', 'Tablets'), 
     ('Phones', 'Phones'), 
     ('Wearables', 'Wearables'), 
     ('Windows', 'Windows'), 
     ('Mac OS X', 'Mac OS X'), 
     ('Linux and Unix', 'Linux and Unix'), 
     ('Programming and Computer Science', 'Programming and Computer Science'), 
     ('Software Development', 'Software Development'), 
     ('Web Development (Front)', 'Web Development (Front)'), 
     ('Web Development (Back)', 'Web Development (Back)'), 
     ('Mobile Development', 'Mobile Development'), 
     ('Game Development', 'Game Development'), 
     ('Algorithms and Data Structures', 'Algorithms and Data Structures'), 
     ('Databases', 'Databases'), 
     ('IDE/Text Editors', 'IDE/Text Editors'), 
     ('Tutorial', 'Tutorial'), 
     ('Opinion', 'Opinion'), 
     ('Miscellaneous', 'Miscellaneous') 
    ] 
    field = models.CharField(choices=CHOICES, max_length=200) 

    def __unicode__(self): 
     return self.title 

    @models.permalink 
    def get_absolute_url(self): 
     return ('blog_post_detail',(), 
       { 
        'slug' :self.slug, 
       }) 

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

這裏是我的views.py

@user_passes_test(lambda u: u.is_authenticated) 
def add_post(request): 
    form = PostForm(request.POST or None) 

    if request.method == "POST": 
     if form.is_valid() and request.user.is_authenticated(): 
      try: 
       post = form.save(commit=False) 
       post.author = request.user 
       post.save() 
       Post.objects.create(author=request.user, title=form.cleaned_data.get("title"), text=form.cleaned_data.get("text")) 
       return redirect(post) 
      except IntegrityError as e: 
       print(e) 
     else: 
      print("Invalid form") 
      print(form.errors) 

    return render_to_response('webapp/startthread.html', 
           { 'form': form, 
           "authenticated": request.user.is_authenticated() }, 
           context_instance=RequestContext(request)) 

回答

4

Django的報道稱,該數據庫將無法保存您的Post數據,因爲slug字段的值已被另一個Post使用。

如果您不想要此行爲,請勿在您的模型中將unique屬性設置爲True,Post.slug。儘管如此,slug通常用於查詢數據庫以查找關聯的Post,因此通常您會希望它是唯一的。