python / intermediate
Snippet
Django URL-Routing und reverse()-Auflösung
Djangos URL-Routing-System verwendet benannte Muster mit umgekehrter Auflösung. Die reverse()-Funktion generiert URLs aus ihrem Namen und Parametern und macht Ihren Code wartbarer, indem sie die URL-Struktur von den Views entkoppelt. Der app_name-Namespace verhindert Namenskonflikte zwischen Apps.
snippet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# urls.pyfrom django.urls import pathfrom . import viewsapp_name = 'blog'urlpatterns = [path('article/<int:year>/<slug:slug>/', views.article_detail, name='article_detail'),path('archive/', views.archive, name='archive'),]# views.pyfrom django.shortcuts import get_object_or_404from django.urls import reversefrom .models import Articledef article_detail(request, year, slug):article = get_object_or_404(Article, pub_date__year=year, slug=slug)share_url = request.build_absolute_uri(reverse('blog:article_detail', args=[year, slug]))return render(request, 'blog/detail.html', {'article': article, 'share_url': share_url})def archive(request):archive_url = reverse('blog:archive') # /archive/return redirect(archive_url)
django
Erklärung
1
app_name = 'blog'
Erstellt einen Namespace für die URL-Muster dieser App, um Konflikte zu vermeiden
2
path('article/<int:year>/<slug:slug>/', ...
Definiert URL-Muster mit Typ-Konvertern: int und slug für dynamische Segmente
3
name='article_detail'
Benennt dieses Muster für die umgekehrte Auflösung in Templates und Views
4
request.build_absolute_uri(reverse(...))
Erstellt vollständige absolute URL einschließlich Domain zum Teilen
5
reverse('blog:article_detail', args=[year, slug])
Löst URL durch App-Namespace und Namen auf, mit Positionsargumenten