Mam taki adres URL Django:
url(
r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$',
'tool.views.ProjectConfig',
name='project_config'
),
views.py:
def ProjectConfig(request, product, project_id=None, template_name='project.html'):
...
# do stuff
Problem w tym, że chcę, aby project_id
parametr był opcjonalny.
Chcę /project_config/
i /project_config/12345abdce/
być równie ważne wzorców URL, tak, że jeśli project_id
zostanie przyjęta, wtedy mogę go używać.
W tej chwili otrzymuję kod 404, gdy uzyskuję dostęp do adresu URL bez project_id
parametru.
źródło
Możesz używać zagnieżdżonych tras
Django <1,8
Django> = 1,8
Jest to o wiele bardziej SUCHE (powiedzmy, że chcesz zmienić nazwę
product
kwarg naproduct_id
, wystarczy zmienić wiersz 4, a wpłynie to na poniższe adresy URL.Edytowane dla Django 1.8 i nowszych
źródło
Jeszcze prostsze jest użycie:
„(A | b)” oznacza a lub b, więc w twoim przypadku byłby to jeden lub więcej znaków wyrazu (\ w +) lub nic.
Więc wyglądałoby to tak:
źródło
None
. Oznacza to, że nie możesz w tym celu polegać na domyślnej wartości w sygnaturze widoku: musisz jawnie przetestować ją wewnątrz i przypisać w konsekwencji.Wersja Django> 2.0 :
Podejście jest zasadniczo identyczne z podejściem podanym w odpowiedzi Yuji „Tomita” Tomita . Problem dotyczy jednak składni:
Za pomocą
path()
można również przekazać dodatkowe argumenty do widoku z opcjonalnym argumentemkwargs
typudict
. W tym przypadku widok nie potrzebuje wartości domyślnej dla atrybutuproject_id
:Aby dowiedzieć się, jak to się robi w najnowszej wersji Django , zobacz oficjalną dokumentację dotyczącą wysyłania adresów URL .
źródło
project_id
ścieżce znajdował się również obrazek w przypadku domyślnego użycia plikudict
. Może to prowadzić do pozornie dziwnego zachowania, ponieważ argument podany wdict
testamencie będzie zawsze używany (o ile dobrze pamiętam).Pomyślałem, że dodam trochę do odpowiedzi.
Jeśli masz wiele definicji adresów URL, musisz nadać im nazwy osobno. Więc tracisz elastyczność podczas wywoływania reverse, ponieważ jeden reverse będzie oczekiwał parametru, a drugi nie.
Inny sposób użycia wyrażenia regularnego w celu dostosowania opcjonalnego parametru:
źródło
Reverse for 'edit_too_late' with arguments '()' and keyword arguments '{'pk': 128}' not found. 1 pattern(s) tried: ['orders/cannot_edit/((?P<pk>\\d+)/)?$']
Django = 2,2
źródło
Posługiwać się ? działa dobrze można sprawdzić na pythex . Pamiętaj, aby dodać parametry * args i ** kwargs w definicji metod widoku
źródło