Ich habe eine Django-URL wie diese:
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
Das Problem ist, dass der project_id
Parameter optional sein soll.
Ich will /project_config/
und /project_config/12345abdce/
gleichermaßen gültiges URL - Muster sein, so dass , wenn project_id
übergeben wird, dann kann ich es verwenden.
Im Moment bekomme ich eine 404, wenn ich ohne den project_id
Parameter auf die URL zugreife .
quelle
Sie können verschachtelte Routen verwenden
Django <1,8
Django> = 1,8
Dies ist viel trockener (
product
Angenommenproduct_id
, Sie wollten das kwarg umbenennen in , Sie müssen nur Zeile 4 ändern, und dies wirkt sich auf die folgenden URLs aus.Bearbeitet für Django 1.8 und höher
quelle
Noch einfacher zu bedienen ist:
Das "(a | b)" bedeutet a oder b, in Ihrem Fall also ein oder mehrere Wortzeichen (\ w +) oder nichts.
So würde es aussehen:
quelle
None
. Dies bedeutet, dass Sie sich hierfür nicht auf einen Standardwert in der Signatur der Ansicht verlassen können: Sie müssen ihn explizit im Inneren testen und in der Folge zuweisen.Django> 2.0 Version :
Der Ansatz ist im Wesentlichen identisch mit dem in Yuji 'Tomita' Tomitas Antwort angegebenen . Betroffen ist jedoch die Syntax:
Mit können
path()
Sie auch zusätzliche Argumente an eine Ansicht mit dem optionalen Argumentkwargs
vom Typ übergebendict
. In diesem Fall würde Ihre Ansicht keine Standardeinstellung für das Attribut benötigenproject_id
:Wie dies in der neuesten Django-Version gemacht wird , finden Sie in den offiziellen Dokumenten zum URL-Versand .
quelle
project_id
noch im Pfad im Falle der Standardeinstellung mit adict
. Dies kann zu scheinbar seltsamem Verhalten führen, da das imdict
Testament angegebene Argument immer verwendet wird (wenn ich mich richtig erinnere).Ich dachte, ich würde der Antwort etwas hinzufügen.
Wenn Sie mehrere URL-Definitionen haben, müssen Sie jede einzeln benennen. Sie verlieren also die Flexibilität, wenn Sie reverse aufrufen, da ein Reverse einen Parameter erwartet, der andere nicht.
Eine andere Möglichkeit, Regex zu verwenden, um den optionalen Parameter aufzunehmen:
quelle
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
quelle
Verwenden ? gut funktionieren, können Sie auf Pythex überprüfen . Denken Sie daran, die Parameter * args und ** kwargs in die Definition der Ansichtsmethoden aufzunehmen
quelle