Sie müssen einen Beitrag mit genau 1 eindeutigen Kennung identifizieren. Das kann entweder die ID oder der Slug sein. Beide zu verwenden ist sinnlos und fehleranfällig. Sie können sowohl einen Slug als auch eine ID in den Titel einfügen. In diesem Fall sollten Sie wahrscheinlich den vollständig in der URL übergebenen Slug ignorieren und die ID verwenden.
Sie die Schnecke ignorieren und nur die ID wie folgt verwenden:
url(r'^(?:[\w-]+)/(?<id>\d+)/$', BlogView.as_view(), name='blog-view')
Wenn Sie tun, dass Sie die Schnecke überhaupt nicht speichern müssen, erzeugen nur aus dem Titel jedes Mal, wenn Sie verwenden es.
Persönlich bevorzuge ich Slugs, weil sie freundlichere URLs bieten, die sich gut mit Django integrieren lassen. Zum Beispiel mit einer Klasse basiert Ansicht können Sie eine URL erstellen, die wie folgt aussieht:
url(r'^(?P<slug>[\w-]+)/$', BlogView.as_view(), name='blog-view')
Und Ihre Klasse basierte Sicht ist super sauber:
class BlogView(DetailView):
model=BlogEntry
Das ist es! Django weiß automatisch, wie das Modell durch den Slug aussieht, und wenn man davon ausgeht, dass man die Vorlage richtig benannt hat, muss man nichts weiter verdrahten (Ok, wahrscheinlich). Es gibt ein wirklich helpful gist auf Github über dieses Setup.
Wenn Sie Slugs verwenden möchten, generieren Sie es, wenn Sie den Datensatz speichern und verwenden Sie eine Art automatische Mangelung, um es eindeutig zu machen, wenn es eine Kollision gibt (oder lassen Sie den Benutzer manuell überschreiben). In einem meiner Blogs verwende ich das Datum im Slug, um es eindeutiger zu machen, und benutze dann eine rekursive Funktion, um sicherzustellen, dass es einzigartig ist. (here's an little tutorial someone made on making unique slugs). Es ist eine gute Idee, einen Weg einzubauen, um den Slug auch manuell zu überfahren.
In dem obigen Link er eine for-Schleife verwendet, persönlich ziehe ich eine rekursive Funktion wie:
def autoslug(self, slug, attempt=1):
if MyModel.objects.filter(slug=slug).exists():
return autoslug(slug[:47]+"%d" % attempt, attempt + 1)
else:
return slug
Sie ein Butzen Feld auf dem Modell erstellen die Schnecke zu speichern. Zum Beispiel können Klassenbasierte Ansichten einen Slug übergeben und es wird auf magische Weise herausfinden, was Sie wollen. Djangos hat eine Vielzahl von internen Tools, die auf diesen Namen verweisen, also halte es einfach und benutze den gleichen Namen, den django erwartet.
Auch die URL für eine bestimmte Ressource sollte unverändert bleiben, so dass Links persistent sind. Das Ändern eines Slugs beim Ändern des Titels bedeutet, dass sich die URL für die Ressource ändert. IMO ist es immer eine schlechte Idee, dass dieselbe Ressource eine sich ändernde URL hat. Es ist schlecht für SEO und schlecht für jeden, der deine Ressourcen extern verlinkt.
Slug ist nur eine Möglichkeit für Sie, um schnell zu verstehen, worum es bei dieser URL geht. Weil url dieser Frage http://stackoverflow.com/questions/42407755/does-it-work sein könnte und immer noch zum selben Beitrag weiterleitet. Aber gesagt, es hängt auch von der Implementierung ab. In diesem Fall könnte es sein, dass Stack Overflow nach einem gültigen Slug sucht, der der Post-ID entspricht, und wenn er nicht gefunden wird, wird er zum ursprünglichen weitergeleitet. – AKS
@AKS, Ihr Kommentar verdient, eine Antwort auf diese Frage zu sein – Marat