Frage

class Foo(models.Model):
    title = models.CharField(max_length=20)
    slug = models.SlugField()

Gibt es eine eingebaute Möglichkeit, die Schnecke Feld zu bekommen auf den Titel automatisch ausgefüllt basiert? Vielleicht in der Admin und außerhalb des Admin.

War es hilfreich?

Lösung

für Admin in Django 1.0 oder höher, werden Sie verwenden müssen

prepopulated_fields = {'slug': ('title',), }

in Ihrem admin.py

Ihr Schlüssel im prepopulated_fields Wörterbuch ist das Feld, das Sie ausgefüllt werden sollen, und der Wert ist ein Tupel von Feldern, die Sie verketteten wollen.

Außerhalb von admin, können Sie die slugify Funktion in Ihren Ansichten verwenden. In Vorlagen können Sie die |slugify Filter verwenden.

Es gibt auch dieses Paket die Pflege dieser automatisch statt: https: //pypi.python .org / pypi / django-autoslug

Andere Tipps

Außerhalb des Admin finden Sie unter dieser django Schnipsel . Legen Sie es in Ihrem .save(), und es wird programmatisch erstellt mit Objekten arbeiten. Im Inneren des admin, wie die anderen gesagt haben, verwenden Sie prepopulated_fields.

Für pre-1.0:

slug = models.SlugField(prepopulate_from=('title',))

sollte gut funktionieren

1.0, verwenden Sie der camflan

Sie können auch pre_save django Signal zum Auffüllen Slug außerhalb von django Admin-Code verwenden. Siehe Django Signale Dokumentation .

Ajax Slug Einzigartigkeit Validierung zu Nutzen sein wird, finden Sie unter As-You-Type Slug Einmaligkeit Validierung @ Irrational Exuberance

autoslug hat für mich in der Vergangenheit recht gut funktioniert. Obwohl ich habe nie versucht, es mit dem Admin-App.

Ich dachte, ich würde ein komplettes hinzufügen und up-to-date Antwort mit gotchas erwähnt:

1. Auto-bevölkern Formen in Django Admin

Wenn Sie nur besorgt über das Hinzufügen und Aktualisieren von Daten im Admin sind, können Sie einfach die prepopulated_fields Attribut

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

admin.site.register(Article, ArticleAdmin)

2. Auto-bevölkert benutzerdefinierte Formulare in Vorlagen

Wenn Sie Ihre eigene Server gerendert Schnittstelle mit Formen aufgebaut haben, können Sie Auto-bevölkern die Felder, indem Sie entweder die | slugify tamplate Filter oder die slugify Dienstprogramm beim Speichern Sie das Formular (is_valid).

3. Autofüllfunktion slugfields auf Modellebene mit django-autoslug

Die oben genannten Lösungen werden nur dann automatisch bevölkern die slugfield (oder ein beliebiges Feld), wenn Daten über diese Schnittstellen (Admin-oder eine benutzerdefinierte Form) manipuliert wird. Wenn Sie eine API haben, Management-Befehle oder irgendetwas anderes, das auch die Daten manipuliert, müssen Sie nach unten, um Modell-Ebene fallen zu lassen.

django-autoslug AutoSlugField-Felder zur Verfügung, die SlugField erweitert und können Sie festlegen, welches Feld sollte es slugify ordentlich:

class Article(Model):
    title = CharField(max_length=200)
    slug = AutoSlugField(populate_from='title')

Das Feld verwendet pre_save und post_save Signale um seine Funktionalität zu erreichen, so wenden Sie sich bitte den Gotcha Text am unteren Rand dieser Antwort sehen.

4. Autofüllfunktion slugfields auf Modellebene durch zwingende save ()

Die letzte Option ist dies selbst zu implementieren, die die Standard-save () Methode beinhaltet überschrieben:

    class Article(Model):
        title = CharField(max_length=200)
        slug = SlugField()

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

Hinweis: Bulk-Updates wird Ihr Code umgehen (einschließlich Signale)

Dies ist ein häufiges Fehlverständnis von Anfängern zu Django. Zunächst sollten Sie wissen, dass die pre_save und post_save Signale direkt an die save () verwandt sind - Methode. Zweitens die verschiedenen Möglichkeiten, Bulk-Updates in Django zu tun umgehen alle save () - Methode hohe Leistung zu erzielen, indem sie direkt auf der SQL-Schicht arbeitet. Dies bedeutet, dass für das Beispiel Modell in Lösung 3 oder 4 oben verwendet:

  • Article.objects.all (). Update (title = 'Neuer Beitrag') wird nicht aktualisieren, um die Schnecke eines Artikels
  • Verwenden von bulk_create oder bulk_update auf dem Artikel Modell wird nicht die Schnecke eines Artikels aktualisieren.
  • Da die save () -. Methode wird nicht aufgerufen, keine pre_save oder post_save Signale ausgesendet werden,

Bulk-Updates zu tun und noch Code-Constraints die einzige Lösung nutzen ist eine nach der anderen Objekte iterieren und rief seine save () - Methode, die als SQL-Level-Bulk-Operationen drastisch weniger Leistung hat. Verwendung löst in Ihrer Datenbank natürlich Sie könnten, obwohl das ein ganz anderes Thema ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top