Django en option paramètres d'url
J'ai un Django URL comme ceci:
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
Le problème est que je veux le project_id
paramètre facultatif.
Je veux /project_config/
et /project_config/12345abdce/
à être tout aussi valables URL motifs, de sorte que si project_id
est passé, puis je peux l'utiliser.
En ce moment, j'obtiens une erreur 404 lorsque j'accède à l'URL sans le project_id
paramètre.
Vous devez vous connecter pour publier un commentaire.
Il existe plusieurs approches.
Est celle de l'utilisation d'un non-capture d'un groupe dans la regex:
(?:/(?P<title>[a-zA-Z]+)/)?
Faire une Regex Django URL Jeton Option
Un autre, plus facile à suivre consiste à avoir plusieurs règles qui correspond à vos besoins, tous pointant vers le même point de vue.
Garder à l'esprit que votre point de vue, vous aurez également besoin de définir une valeur par défaut pour l'option paramètre de l'URL, ou vous obtiendrez un message d'erreur:
{% url 'view_name' param1 param2 param3 %}
indépendamment de param2 ou param3 été définis, j'ai utilisé*
au lieu de+
dans urls.py. L'inconvénient est que rendus lien est quelque chose commepath///
(dans le cas param2 et param3 ne sont pas définis), mais il permet d'économiser beaucoup deif
sVous pouvez imbriquer des itinéraires
Django <1.8
Django >=1.8
C'est beaucoup plus SEC (Disons que vous voulez renommer le
product
kwarg àproduct_id
, il vous suffit de modifier la ligne 4, et il aura une incidence sur l'Url ci-dessous.Édité pour Django 1,8 et au-dessus de
Il est encore plus facile à utiliser:
L' "(a|b)" s'entend d'un ou de b, donc dans votre cas il s'agirait d'un ou plusieurs caractères de mot (\w+) ou rien.
De sorte qu'il pourrait ressembler:
None
. Ce qui signifie que vous ne pouvez pas compter sur une valeur par défaut dans la vue de la signature pour cela: vous devez explicitement le tester à l'intérieur et à l'affecter en conséquence.J'ai pensé ajouter un peu de la réponse.
Si vous avez plusieurs URL définitions, alors vous aurez à nom de chacun d'eux séparément. Donc, vous perdez la flexibilité lors de l'appel inverse puisque l'on inverse s'attend à un paramètre, tandis que les autres ne le seront pas.
Une autre façon d'utiliser les regex pour accueillir le paramètre facultatif:
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 > version 2.0:
L'approche est essentiellement identique à celle donnée dans Yuji 'Tomita' Tomita Réponse. Touchés, cependant, est la syntaxe:
À l'aide de
path
vous pouvez également passer des arguments supplémentaires à vue avec undict
comme argument optionnel. Dans ce cas, votre point de vue, pas besoin d'un défaut de l'attributproject_id
:Pour la façon dont cela est fait dans la plus récente version de Django, voir l'officiel de docs sur l'URL de dispatching.
project_id
encore dans le chemin d'accès en cas de défaut à l'aide d'undict
. Cela peut conduire à l'apparence étrange comportement, comme l'argument fourni dans ledict
sera toujours utilisé (si je me souviens bien).Django = 2.2