J'ai une URL Django comme celle-ci:
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 que le project_id
paramètre soit facultatif.
Je veux /project_config/
et /project_config/12345abdce/
être des modèles d'URL aussi valides, de sorte que si project_id
est passé, alors je peux l' utiliser.
Dans l'état actuel des choses, j'obtiens un 404 lorsque j'accède à l'URL sans le project_id
paramètre.
la source
Vous pouvez utiliser des itinéraires imbriqués
Django <1,8
Django> = 1,8
C'est beaucoup plus DRY (
product
disons que vous vouliez renommer le kwarg enproduct_id
, il vous suffit de changer la ligne 4, et cela affectera les URL ci-dessous.Édité pour Django 1.8 et supérieur
la source
Encore plus simple est d'utiliser:
Le "(a | b)" signifie a ou b, donc dans votre cas ce serait un ou plusieurs caractères de mot (\ w +) ou rien.
Cela ressemblerait donc à:
la source
None
. Cela signifie que vous ne pouvez pas vous fier à une valeur par défaut dans la signature de la vue pour cela: vous devez la tester explicitement à l'intérieur et l'assigner en conséquence.Django> version 2.0 :
L'approche est essentiellement identique à celle donnée dans la réponse de Yuji 'Tomita' Tomita . La syntaxe est cependant affectée:
En utilisant,
path()
vous pouvez également passer des arguments supplémentaires à une vue avec l'argument facultatifkwargs
de typedict
. Dans ce cas, votre vue n'aurait pas besoin d'une valeur par défaut pour l'attributproject_id
:Pour savoir comment cela se fait dans la version la plus récente de Django , consultez la documentation officielle sur la répartition des URL .
la source
project_id
toujours dans le chemin dans le cas de la valeur par défaut en utilisant undict
. Cela peut conduire à un comportement apparemment étrange, car l'argument fourni dans ledict
sera toujours utilisé (si je me souviens bien).J'ai pensé que j'ajouterais un peu à la réponse.
Si vous avez plusieurs définitions d'URL, vous devrez nommer chacune d'elles séparément. Ainsi, vous perdez la flexibilité lors de l'appel inverse car un inverse attendra un paramètre tandis que l'autre ne le fera pas.
Une autre façon d'utiliser regex pour accueillir le paramètre facultatif:
la source
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
la source
Utilisation ? fonctionne bien, vous pouvez vérifier sur pythex . N'oubliez pas d'ajouter les paramètres * args et ** kwargs dans la définition des méthodes de vue
la source