Saya memiliki URL Django seperti ini:
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
Masalahnya adalah saya ingin project_id
parameternya opsional.
Saya ingin /project_config/
dan /project_config/12345abdce/
menjadi pola URL yang sama-sama valid, sehingga jika project_id
diteruskan, maka saya dapat menggunakannya.
Seperti saat ini, saya mendapatkan 404 ketika saya mengakses URL tanpa project_id
parameter.
sumber
Anda dapat menggunakan rute bersarang
Django <1.8
Django> = 1.8
Ini jauh lebih KERING (Katakanlah Anda ingin mengganti nama
product
kwarg menjadiproduct_id
, Anda hanya perlu mengubah baris 4, dan itu akan mempengaruhi URL di bawah ini.Diedit untuk Django 1.8 dan lebih tinggi
sumber
Yang lebih sederhana adalah menggunakan:
"(A | b)" berarti a atau b, jadi dalam kasus Anda ini akan menjadi satu atau lebih karakter kata (\ w +) atau tidak sama sekali.
Jadi akan terlihat seperti:
sumber
None
. Berarti Anda tidak dapat mengandalkan nilai default pada tanda tangan tampilan untuk ini: Anda harus mengujinya secara eksplisit di dalam dan menetapkan konsekuensinya.Django> versi 2.0 :
Pendekatan ini pada dasarnya identik dengan yang diberikan dalam Yuji 'Tomita' Tomita's Answer . Namun, yang terpengaruh adalah sintaks:
Menggunakan
path()
Anda juga bisa memberikan argumen tambahan ke tampilan dengan argumen opsionalkwargs
yang bertipedict
. Dalam hal ini tampilan Anda tidak perlu default untuk atributproject_id
:Untuk bagaimana hal ini dilakukan dalam versi Django terbaru , lihat dokumen resmi tentang pengiriman URL .
sumber
project_id
masih ada di path jika default menggunakan adict
. Hal ini dapat menyebabkan perilaku yang tampaknya aneh, karena argumen yang diberikan didict
akan selalu digunakan (jika saya ingat dengan benar).Kupikir aku akan menambahkan sedikit ke jawabannya.
Jika Anda memiliki beberapa definisi URL maka Anda harus memberi nama masing-masing secara terpisah. Jadi, Anda kehilangan fleksibilitas saat memanggil mundur karena satu kebalikan akan mengharapkan parameter sementara yang lain tidak.
Cara lain untuk menggunakan regex untuk mengakomodasi parameter opsional:
sumber
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
sumber
Gunakan? bekerja dengan baik, Anda dapat memeriksa pythex . Ingatlah untuk menambahkan parameter * args dan ** kwargs dalam definisi metode tampilan
sumber