Wie erstelle ich einen Slug in Django?

Lesezeit: 5 Minuten

Benutzer-Avatar
Johnd

Ich versuche eine zu erstellen SlugField in Django.

Ich habe dieses einfache Modell erstellt:

from django.db import models

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

Das mache ich dann:

>>> from mysite.books.models import Test
>>> t=Test(q="aa a a a", s="b b b b")
>>> t.s
'b b b b'
>>> t.save()
>>> t.s
'b b b b'

ich habe erwartet b-b-b-b.

Benutzer-Avatar
Kumpel

Sie müssen die verwenden schleichen Funktion.

>>> from django.template.defaultfilters import slugify
>>> slugify("b b b b")
u'b-b-b-b'
>>>

Du kannst anrufen slugify automatisch durch Überschreiben der save Methode:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()
    
    def save(self, *args, **kwargs):
        self.s = slugify(self.q)
        super(Test, self).save(*args, **kwargs)

Beachten Sie, dass das Obige dazu führt, dass sich Ihre URL ändert, wenn die q Feld bearbeitet wird, welches können fehlerhafte Links verursachen. Es kann vorzuziehen sein, den Slug nur einmal zu generieren, wenn Sie ein neues Objekt erstellen:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()
    
    def save(self, *args, **kwargs):
        if not self.id:
            # Newly created object, so set slug
            self.s = slugify(self.q)

        super(Test, self).save(*args, **kwargs)

  • schüchtern einen besonderen Modeltyp haben? Warum nicht einfach CharFields slugifizieren?

    – Johannes

    8. Mai 2009 um 3:31 Uhr

  • SlugFields setzen standardmäßig db_index=True und verwenden standardmäßig auch ein Formularfeld, das eine Validierungs-Regex hat, um gültige Slugs zu erfordern (falls in einer ModelForm oder im Admin dargestellt). Sie können diese Dinge manuell mit einem CharField tun, wenn Sie dies bevorzugen, es macht nur die Absicht Ihres Codes weniger klar. Vergessen Sie auch nicht die Einstellung prepopulate_fields ModelAdmin, wenn Sie JS-basiertes automatisches Vorbefüllen im Admin möchten.

    – Karl Meier

    8. Mai 2009 um 14:22 Uhr

  • Wie Dingle unten in seiner Antwort sagte, müssen Sie ersetzen def save(self): mit def save(self, *args, **kwargs): um zu vermeiden, dass Fehler beim Schreiben von so etwas ausgelöst werden test.objects.create(q="blah blah blah").

    – Liam

    24. März 2010 um 17:11 Uhr

  • Beachten Sie, dass dieser Code den Slug bei jedem Speichern aktualisiert. Ihre URL ändert sich und “Coole URIs ändern sich nicht” w3.org/Provider/Style/URI.html

    – dzen

    3. Juni 2011 um 9:37 Uhr

  • slugify() finden Sie auch in django.utils.text.slugifynicht klar, wann dies hinzugefügt wurde.

    – Mrmagooey

    10. Februar 2013 um 23:54 Uhr

Es gibt Eckfälle mit einigen UTF-8-Zeichen

Beispiel:

>>> from django.template.defaultfilters import slugify
>>> slugify(u"test ąęśćółń")
u'test-aescon' # there is no "l"

Dies kann mit gelöst werden Unidecode

>>> from unidecode import unidecode
>>> from django.template.defaultfilters import slugify
>>> slugify(unidecode(u"test ąęśćółń"))
u'test-aescoln'

  • utf-8 wird jetzt korrekt von slugify gehandhabt (in django 1.8.5)

    – Rick Westera

    20. November 2015 um 23:53 Uhr

  • Wie @RickWestera sagte, wird dies jetzt von slugify gehandhabt. Wenn Sie slugify aus irgendeinem Grund nicht verwenden möchten, überprüfen Sie iri_to_uri von django.utils.encoding: docs.djangoproject.com/en/2.0/ref/unicode/…

    – Erwol

    24. März 2018 um 5:53 Uhr


Benutzer-Avatar
Dingl

Eine kleine Korrektur zu Thepeers Antwort: Zum Überschreiben save() Funktion in Modellklassen, fügen Sie besser Argumente hinzu:

from django.utils.text import slugify

def save(self, *args, **kwargs):
    if not self.id:
        self.s = slugify(self.q)

    super(test, self).save(*args, **kwargs)

Andernfalls, test.objects.create(q="blah blah blah") wird zu einem führen force_insert Fehler (unerwartetes Argument).

  • Eine weitere sehr kleine Sache, die der Antwort des Kollegen hinzugefügt werden sollte: Ich würde diese letzte Zeile machen return super(test, self).save(*args, **kwargs). Ich denke, diese Methode kehrt zurück Noneund ich kenne keine Pläne, das zu ändern, aber es schadet nicht, zurückzugeben, was die Methode der Oberklasse tut, falls sie sich irgendwann in der Zukunft ändert.

    – Duncan Parkes

    23. August 2011 um 21:16 Uhr


  • Bitte fügen Sie das hinzu aus django.utils.text import slugify wird für diese Lösung benötigt.

    – Rouhinator

    7. Mai 2016 um 22:47 Uhr


  • @Routhinator hat es geschafft

    – Jonas Gröger

    19. August 2016 um 17:33 Uhr

  • Strecken Sie einige Fühler aus, um zu fragen, ob dies immer noch eine bevorzugte Methode ist, dies zu tun.

    – Sytech

    17. Januar 2018 um 15:17 Uhr

Benutzer-Avatar
Heinrich

Wenn Sie die Admin-Oberfläche verwenden, um neue Elemente Ihres Modells hinzuzufügen, können Sie eine ModelAdmin in deiner admin.py und nutzen prepopulated_fields So automatisieren Sie die Eingabe eines Slugs:

class ClientAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('name',)}

admin.site.register(Client, ClientAdmin)

Hier, wenn der Benutzer einen Wert in das Admin-Formular für die eingibt name Feld, das slug wird automatisch mit dem korrekten Slugified ausgefüllt name.

Benutzer-Avatar
der Peer

In den meisten Fällen sollte sich der Slug nicht ändern, also möchten Sie ihn wirklich nur beim ersten Speichern berechnen:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField(editable=False) # hide from admin

    def save(self):
        if not self.id:
            self.s = slugify(self.q)

        super(Test, self).save()

Benutzer-Avatar
Stromweber

Wenn Sie das Slugfield nicht auf Not be editable setzen möchten, sollten Sie die Eigenschaften Null und Blank auf False setzen. Andernfalls erhalten Sie eine Fehlermeldung, wenn Sie versuchen, in Admin zu speichern.

Eine Modifikation des obigen Beispiels wäre also:

class test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField(null=True, blank=True) # Allow blank submission in admin.

    def save(self):
        if not self.id:
            self.s = slugify(self.q)

        super(test, self).save()

Benutzer-Avatar
daaawx

Verwenden prepopulated_fields in Ihrer Admin-Klasse:

class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}

admin.site.register(Article, ArticleAdmin)

  • Könntest du erklären? Wie wirkt sich der Admin auf das Projekt aus?

    – Brice

    2. Oktober 2013 um 16:44 Uhr

1055780cookie-checkWie erstelle ich einen Slug in Django?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy