2016-04-13 8 views
1

Wenn ich versuche, einen neuen Beitrag Objekt zu erstellen, spuckt Python die folgende Fehlermeldung aus:Django UNIQUE fehlgeschlagen: webapp_post.slug

UNIQUE constraint failed: webapp_post.slug 

Hier ist meine 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) 

hier ist meine 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)) 

Antwort

4

Django berichtet, dass die Datenbank nicht Ihre Post Daten speichern, weil Der Wert des Felds slug wird bereits von einem anderen Post verwendet.

Wenn Sie dieses Verhalten nicht möchten, legen Sie das unique-Attribut in Ihrem Modell nicht auf True auf Post.slug fest. Bedenken Sie jedoch, dass die slug oft verwendet wird, um die Datenbank abzufragen, um die zugehörige Post zu finden, also sollten Sie sie im Allgemeinen einzigartig machen.

Verwandte Themen