Muszę dynamicznie zbudować adres URL zgodnie z aktualnym adresem URL. Używanie {% url %}
tagu to najłatwiejszy sposób, ale potrzebuję aktualnej nazwy adresu URL, aby dynamicznie wygenerować nowy.
Jak mogę uzyskać nazwę adresu URL dołączoną do urlconf, która prowadzi do bieżącego widoku?
EDYCJA: Wiem, że mogę ręcznie stworzyć adres URL, get_absolute_url
ale wolałbym tego uniknąć, ponieważ jest to część wykładu i chciałbym zademonstrować tylko jeden sposób tworzenia adresów URL.
Uczniowie wiedzą, jak używać {% url %}
. Wiedzą, że napotykają problem, kiedy muszą wygenerować bardziej kompletny adres URL na podstawie bieżącego. Najłatwiej jest użyć go {% url %}
ponownie, z pewnymi zmianami. Ponieważ nazwaliśmy url, musimy wiedzieć, jak uzyskać nazwę adresu URL, który wywołał bieżący widok.
EDYCJA 2: innym przypadkiem użycia jest wyświetlanie części szablonu podstawowego w inny sposób w zależności od szablonu podstawowego. Są na to inne sposoby (używając CSS i {% block%}, ale czasami miło jest móc usunąć znacznik wpisu menu base.html, jeśli nazwa widoku pasuje do linku.
źródło
{{ request.get_full_path }}
Odpowiedzi:
Nie wiem, jak długo ta funkcja była częścią Django, ale jak pokazuje poniższy artykuł , można to osiągnąć w następujący sposób:
from django.core.urlresolvers import resolve current_url = resolve(request.path_info).url_name
Jeśli potrzebujesz tego w każdym szablonie, napisanie żądania szablonu może być odpowiednie.
Edycja: STOSOWANIE NOWEJ AKTUALIZACJI DJANGO
Po aktualnej aktualizacji Django:
Django 1.10 ( link )
Django 2.0 ( łącze )
Tak więc właściwy sposób jest następujący:
from django.urls import resolve current_url = resolve(request.path_info).url_name
źródło
resolve()
nie można rozwiązać, jeśli przekażesz ciąg zapytania i po prostu podniesie 404.get_full_path()
zwraca ścieżkę i ciąg zapytania. Będziesz musiał użyćresolve(request.path_info)
.current
adres URL musi zostać rozwiązany, ale, powiedzmy, ten, do którego użytkownik ma przekierować? Jaki jest bardziej ogólny sposób osiągnięcia tego? Odpowiedź Conleya Owensa ma wskazówkę, ale wolałbym nie wymyślać koła na nowo, jeśli to koło już istnieje w Django pod maską.Począwszy od Django 1.5, dostęp do tego można uzyskać z obiektu żądania
current_url = request.resolver_match.url_name
https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.resolver_match
źródło
AttributeError: 'WSGIRequest' object has no attribute 'resolver_match'
.view_name
jeśli potrzebujesz przestrzeni nazwDla tych, którzy używają przestrzeni nazw swoich wzorców adresów URL, możesz być zainteresowany nazwą adresu URL żądania w przestrzeni nazw. W tym przypadku Django nazwał go
view_name
zamiast tego.request.resolver_match.view_name # return: <namespace>:<url name>
źródło
urls.py
to @ dariusz-niespodziany jest natychmiastowo dostępnereverse
. Ale jeśli używasz przestrzeni nazw,resolver_match.url_name
nie można jej bezpośrednioreverse
używać. Dlatego musisz samodzielnie dołączyć przestrzeń nazw. Więc zamiast robić to samemu, Django już ustawił.view_name
przy inicjalizacji.Można to osiągnąć poprzez:
request.resolver_match.url_name
Django> 1,8
źródło
Wyjaśnienie pytania: „W widoku, jak uzyskać nazwę wzorca adresu URL, który na niego wskazuje, zakładając, że istnieje dokładnie jeden taki wzorzec adresu URL”.
Może to być pożądane z podanych powodów: z widoku chcemy DRY sposób uzyskać adres URL do tego samego widoku (nie chcemy znać naszej własnej nazwy wzorca adresu URL).
Krótka odpowiedź: nie jest wystarczająco proste, aby uczyć swoją klasę, ale może to być zabawne zajęcie dla Ciebie za godzinę lub dwie i zwymiotowanie na GitHubie.
Jeśli naprawdę chciałbyś to zrobić, musiałbyś podklasować RegexURLResolver i zmodyfikować metodę rozstrzygania, aby zwracała dopasowany wzorzec (z którego możesz pobrać nazwę wzorca) zamiast par widok i słowo kluczowe / wartość. http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142
Następnie można utworzyć dekorator lub bardziej odpowiednie oprogramowanie pośredniczące, które używa tej podklasy do pobierania nazwy wzorca i przechowywania tej wartości gdzieś w żądaniu, aby widoki mogły z niej korzystać.
Jeśli naprawdę chcesz to zrobić i napotkasz kłopoty, daj mi znać, a prawdopodobnie pomogę.
Dla twojej klasy chciałbym po prostu zakodować na stałe nazwę wzoru w widoku lub szablonie. Uważam, że jest to akceptowalny sposób robienia tego.
Aktualizacja: Im więcej o tym myślę, tym bardziej odradzam próbę uzyskania nazwy urlpattern w widoku. Parametry urlpattern są dość niezależne od parametrów widoku, na który wskazują. Jeśli chcesz wskazać określony adres URL, musisz wiedzieć, jak działa wzorzec url, a nie tylko jak działa widok. Jeśli chcesz wiedzieć, jak działa wzorzec url, równie dobrze możesz znać jego nazwę.
źródło
Po prostu spróbuj
request.path
. Spowoduje to wyświetlenie żądanej bieżącej ścieżki.źródło
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
źródło
To trochę niejasne z Twojego pytania, ale http://docs.djangoproject.com/en/dev/topics/http/urls/ prawdopodobnie wyjaśni, czego szukasz.
Szczególnie przydatna jest uwaga, jak Django przetwarza żądania:
Gdy użytkownik zażąda strony z witryny opartej na Django, jest to algorytm, który system stosuje, aby określić, który kod Pythona ma wykonać:
Jeśli szukasz pełnej ścieżki, możesz spróbować:
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
Mam nadzieję, że to pomoże - wskazuje, jak używać modułu URLconf i mam nadzieję, że pomoże ci wskazać właściwy kierunek.
źródło