>>> 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"
>>> 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
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
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.
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()
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()