python model - Was ist eine "Schnecke" in Django?




auto slug (8)

Wenn ich Django-Code lese, sehe ich oft in Modellen einen sogenannten "Slug". Ich bin nicht ganz sicher, was das ist, aber ich weiß, dass es etwas mit URLs zu tun hat. Wie und wann soll dieses Slug-Ding benutzt werden?

(Ich habe seine Definition in diesem Glossar gelesen.)


Answers

Auch Auto Slug bei Django-Admin. Hinzugefügt bei ModelAdmin:

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

Wie hier:

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'slug')
    search_fields = ('content', )

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

Der Begriff "Slug" stammt aus der Zeitungsredaktion.

Es ist der informelle Name einer Geschichte während des Produktionsprozesses. Während die Geschichte ihren schlimmen Weg vom Beat-Reporter über den Redakteur bis hin zu den "Druckmaschinen" beschreitet, ist dies der Name, auf den verwiesen wird, zB "Haben Sie diese Fehler in der Geschichte" russia-cuts-europe-gas "behoben? ? ".

Django verwendet es als Teil der URL, um die Geschichte zu finden, ein Beispiel ist www.mysite.com/archives/russia-cuts-europe-gas .


Von here .

"Slug" ist ein Zeitungsausdruck, aber was es hier bedeutet, ist das letzte Bit der URL. Zum Beispiel würde ein Beitrag mit dem Titel "Ein bisschen über Django" automatisch "Bit-über-Django" werden (Sie können es natürlich leicht ändern, wenn Sie den automatisch generierten Slug nicht mögen).


Wenn ich einen historischen Kontext angeben kann:

Der Begriff "Slug" hat mit dem Gießen von Metall-Blei zu tun, in diesem Fall - aus dem die Druckschriften gemacht wurden. Jedes Papier wurde dann seine Schriften Fabrik regelmäßig wieder geschmolzen und in frischen Formen neu gegossen, da nach vielen Drucken sie abgenutzt wurden. Lehrlinge wie ich begannen dort ihre Karriere und gingen den ganzen Weg bis zur Spitze (nicht mehr).

Typografen mussten den Text eines Artikels rückwärts zusammensetzen, wobei die Hauptfiguren in einer Weise gestapelt waren. Zur Druckzeit wären die Buchstaben also gerade auf dem Papier. Alle Typografen konnten die Zeitung so schnell wie die gedruckte Zeitung lesen. Deshalb waren die Schnecken (wie Schnecken) auch die langsamen Geschichten (die letzten, die repariert werden mussten), viele auf der Bank wartend, nur durch ihre ersten Buchstaben identifiziert, meist der ganze Titel allgemein lesbarer. Einige "heiße" Nachrichten warteten dort auf der Bank auf eine mögliche Last-Minute-Korrektur, (Abendzeitung) vor der letzten Versammlung und endgültigen Drucklegung.

Django kam aus den Büros des Lawrence-Journals in Kansas. Wo wahrscheinlich noch etwas Druckjargon verweilt. A-Django-Enthusiast - & - Freundlicher-Old-Slug-Boy-aus-Frankreich.


Es ist ein beschreibender Teil der URL, der vorhanden ist, um ihn anschaulicher zu machen, aber ohne dass er vom Webserver benötigt wird - in Was ist ein "Slug" in Django? Der Slug ist "In-Django-What-Is-A-Slug", aber der Slug wird nicht verwendet, um die Seite zu bestimmen (zumindest auf dieser Seite)


Slug ist ein URL-freundliches Kurzlabel für bestimmte Inhalte. Es enthält nur Buchstaben, Zahlen, Unterstriche oder Bindestriche. Slugs werden normalerweise mit dem entsprechenden Inhalt gespeichert und als URL-String übergeben.

Slug kann mit SlugField erstellen

Ex:

Class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100)

Wenn Sie Titel als Slug Django verwenden möchten, haben Sie eine einfache Funktion namens slugify

from django.template.defaultfilters import slugify

class Article(models.Model):
    title = models.CharField(max_length=100)

    def slug(self):
        return slugify(self.title)

Wenn es eine Eindeutigkeit benötigt, fügen Sie unique=True im Slug-Feld hinzu.

zum Beispiel aus dem vorherigen Beispiel:

Class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, unique=True)

Bist du faul, Slug-Prozess zu machen? Mach dir keine Sorgen, dieses Plugin wird dir helfen. django-autoslug


Es ist eine Möglichkeit, eine gültige URL zu generieren, die in der Regel bereits erhaltene Daten verwendet. Verwenden Sie beispielsweise den Titel eines Artikels, um eine URL zu generieren. Ich würde empfehlen, den Slug mit einer Funktion zu erzeugen, die einen Titel (oder ein anderes Datenelement) enthält, anstatt sie manuell zu setzen.

Ein Beispiel:

<title> The 46 Year Old Virgin </title>
<content> A silly comedy movie </content>
<slug> the-46-year-old-virgin </slug>

Nun stellen wir uns vor, dass wir ein Django-Modell haben wie:

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField(max_length=1000)
    slug = models.SlugField(max_length=40)

Wie würden Sie dieses Objekt mit einer URL mit einem aussagekräftigen Namen referenzieren? Sie könnten Article.id verwenden, damit die URL wie folgt aussieht:

www.example.com/article/23

Oder Sie könnten den Titel wie folgt referenzieren:

www.example.com/article/The 46 Year Old Virgin

Problem ist, dass Leerzeichen in URLs nicht gültig sind. Sie müssen durch %20 was hässlich ist und Folgendes bewirkt:

www.example.com/article/The%2046%20Year%20Old%20Virgin

Das löst unsere sinnvolle URL nicht. Wäre das nicht besser:

www.example.com/article/the-46-year-old-virgin

Das ist eine Schnecke. the-46-year-old-virgin . Alle Buchstaben sind downcased und Leerzeichen werden durch Bindestriche ersetzt. Ein Beispiel finden Sie in der URL dieser Webseite!


Anforderungen: Django==2.0.2 , django-querysetsequence==0.8

Ich weiß, dass diese Frage irgendwie alt ist, aber ich werde meine Lösung aufstellen, falls es jemandem hilft.

QuerySet Sie django-queryset-sequence kombinieren und trotzdem ein QuerySet , sollten Sie django-queryset-sequence .

Aber eine Notiz darüber. Es benötigt nur zwei querysets als Argument. Aber mit Python reduce Sie es immer auf mehrere queryset .

from functools import reduce
from queryset_sequence import QuerySetSequence

combined_queryset = reduce(QuerySetSequence, list_of_queryset)

Und das ist es. Unten ist eine Situation, in die ich geraten bin und wie ich list comprehension , django-queryset-sequence und django-queryset-sequence

from functools import reduce
from django.shortcuts import render    
from queryset_sequence import QuerySetSequence

class People(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    mentor = models.ForeignKey('self', null=True, on_delete=models.SET_NULL, related_name='my_mentees')

class Book(models.Model):
    name = models.CharField(max_length=20)
    owner = models.ForeignKey(Student, on_delete=models.CASCADE)

# as a mentor, I want to see all the books owned by all my mentees in one view.
def mentee_books(request):
    template = "my_mentee_books.html"
    mentor = People.objects.get(user=request.user)
    my_mentees = mentor.my_mentees.all() # returns QuerySet of all my mentees
    mentee_books = reduce(QuerySetSequence, [each.book_set.all() for each in my_mentees])

    return render(request, template, {'mentee_books' : mentee_books})






python django django-models slug