2016-08-05 21 views
3

Ich arbeite an django Anwendung, und ich habe, wie unten Anwendungs ​​Basis-URL:Wie umschreiben Base-URL in Django, um Benutzername in der URL aller Seiten anstelle von App-Name hinzugefügt?

127.0.0.1:8000/myblog/page 

wo 127.0.0.1:8000 Basis-URL ist und myblog ist App-Name und Seite ist Seitenname . Also meine Forderung ist die URL, so etwas zu ändern, ohne den internen Code meiner Anwendung zu ändern:

127.0.0.1:8000/username/page 

Grundsätzlich ich App wollen Name mit dem Benutzernamen in der URL ändern. Ich habe die in this angegebene SO Frage ausprobiert. Aber es half nicht viel.

+2

https://docs.djangoproject.com/ja/1.9/topics/http/urls/ Sie können die URL-Parameter in Ihrer Ansicht erhalten. Sie können es von dort nehmen. – nightgaunt

Antwort

9

Sie können Benutzernamen in url regexp args geben und fordern Benutzer von request Klasse erhalten:
Ansicht:

def user_page(request, username): 
    try: 
     user = User.objects.get(username=username) 
    except User.DoesNotExists: 
     raise Http404 
    # or use shortcut get_object_or_404(User, username=username) 
    if request.user.username != user.username: 
     raise Http404 
    return render(request, 'templates/user_template', {'user':user}) 

Urls:

url(r'^(?<username>\w+)/page/$', views.user_page, name='user_page') 

Hinweis: username Feld nicht gültig Wahl, wenn es nicht eindeutig, es wird ein Fehler auftreten, wenn Sie mehr als einen Benutzer von User.objects.get() erhalten. Bessere Verwendung pk Feld für die Suche auf der Benutzerseite.

Es gibt jedoch eine einfachere Möglichkeit, eine Benutzerseite für den Anforderungsbenutzer zu erstellen. Nur eine URL ohne Keyword-Argumente, die Antwortdaten für authentifizierte Benutzer:

Ansicht:

def user_page(request): 
    user = None 
    if request.user.is_authenticated(): 
     user = User.objects.get(pk=request.user.pk) 
    return render(request, 'templates/user_template', {'user': user}) 

Urls:

url(r'^page/$', views.user_page, name='user_page') 

es nun Daten zurückgeben basierend auf Anfrage Benutzer oder None, wenn der Benutzer nicht ist authentifiziert