0 Tage Serie
python / intermediate
Snippet

Django URL-Konfiguration mit Namespace und Namen

URL-Namespacing in Django verhindert Namenskollisionen, wenn mehrere Apps ähnliche URL-Namen wie 'home' oder 'detail' verwenden. Die Variable app_name in der App-urls.py kombiniert mit Namespace in Projekt-urls.py erstellt das 'app:name' Muster. Diese Trennung bedeutet, dass shop:home und blog:home unterschiedlich sind und nicht kollidieren. In Templates verwende {% url 'namespace:name' args %} Syntax. In Python-Code generiert django.urls.reverse() URLs. Benannte URL-Muster verbessern Wartbarkeit: Eine Änderung des URL-Pfads erfordert nur das Aktualisieren des Musters, nicht jedes Template oder jeden View, das darauf verweist. Djangos Admin nutzt dieses Muster stark für Erweiterbarkeit.

snippet.py
python
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
28
29
30
31
32
33
34
# project/urls.py
from django.urls import path, include
urlpatterns = [
path('shop/', include('shop.urls', namespace='shop')),
path('blog/', include('blog.urls', namespace='blog')),
]
# shop/urls.py
from django.urls import path
from . import views
app_name = 'shop' # Enables namespacing
urlpatterns = [
path('', views.home, name='home'),
path('products/<int:pk>/', views.product_detail, name='product-detail'),
path('category/<slug:slug>/', views.category_view, name='category'),
]
# blog/urls.py
app_name = 'blog'
urlpatterns = [
path('', views.post_list, name='post-list'),
path('<int:year>/<int:month>/<slug:slug>/', views.post_detail, name='post-detail'),
]
# Template usage:
# <a href="{% url 'shop:product-detail' product.id %}">View Product</a>
# <a href="{% url 'blog:post-detail' post.date.year post.date.month post.slug %}">
# Reverse in Python:
# from django.urls import reverse
# url = reverse('shop:product-detail', kwargs={'pk': 42})
django
Erklärung
1
namespace='shop'
Projekt-Level Namespace-Gruppierung für URL-Muster
2
app_name = 'shop'
App-Level Identifikator ermöglicht 'shop:url-name' Referenzierung
3
{% url 'shop:product-detail' product.id %}
Template-Tag referenziert namespaced URL mit Positionsargument