Saya harus membangun url secara dinamis sesuai dengan url saat ini. Menggunakan {% url %}
tag adalah cara termudah untuk melakukannya, tetapi saya memerlukan nama url saat ini untuk membuat yang baru secara dinamis.
Bagaimana cara mendapatkan nama url yang dilampirkan ke urlconf yang mengarah ke tampilan saat ini?
EDIT: Saya tahu saya bisa secara manual membuat url menggunakan get_absolute_url
tetapi saya lebih suka menghindarinya karena itu bagian dari kuliah dan saya ingin menunjukkan hanya satu cara untuk membangun url.
Para siswa tahu cara menggunakan {% url %}
. Mereka tahu bahwa mereka menghadapi masalah ketika mereka harus membuat url yang lebih lengkap berdasarkan url saat ini. Cara termudah adalah menggunakannya {% url %}
kembali, dengan beberapa variasi. Karena kita telah menamai url, kita perlu mengetahui bagaimana mendapatkan nama url yang disebut tampilan saat ini.
EDIT 2: kasus penggunaan lain adalah menampilkan bagian dari templat dasar secara berbeda sesuai dengan templat dasar. Ada cara lain untuk melakukannya (menggunakan CSS dan {% block%}, tapi kadang-kadang senang bisa menghapus tag dari entri menu base.html jika nama tampilan cocok dengan link.
sumber
{{ request.get_full_path }}
Jawaban:
Saya tidak tahu berapa lama fitur ini telah menjadi bagian dari Django tetapi seperti yang diperlihatkan artikel berikut , ini dapat dicapai sebagai berikut dalam tampilan:
from django.core.urlresolvers import resolve current_url = resolve(request.path_info).url_name
Jika Anda membutuhkannya di setiap template, menulis permintaan template bisa jadi sesuai.
Sunting: MENERAPKAN PEMBARUAN DJANGO BARU
Mengikuti pembaruan Django saat ini:
Django 1.10 ( tautan )
Django 2.0 ( tautan )
Jadi, cara yang benar untuk melakukannya adalah seperti ini:
from django.urls import resolve current_url = resolve(request.path_info).url_name
sumber
resolve()
tidak dapat menyelesaikan jika Anda mengirimkannya string kueri dan hanya memunculkan 404.get_full_path()
mengembalikan jalur dan string kueri. Anda perlu menggunakanresolve(request.path_info)
.current
url yang harus diselesaikan, tetapi, misalnya, yang akan dialihkan oleh pengguna? Apa cara yang lebih umum untuk melakukannya? Jawaban Conley Owens memiliki petunjuk, tetapi saya lebih suka tidak menemukan kembali roda jika roda tersebut sudah ada di Django di bawah kap mesin.Pada Django 1.5, ini dapat diakses dari objek permintaan
current_url = request.resolver_match.url_name
https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.resolver_match
sumber
AttributeError: 'WSGIRequest' object has no attribute 'resolver_match'
.view_name
jika Anda memerlukan namespaceBagi mereka yang menamai pola url mereka, maka Anda mungkin tertarik dengan nama url ber-namespace dari permintaan tersebut. Dalam kasus ini, Django memanggilnya sebagai
view_name
gantinya.request.resolver_match.view_name # return: <namespace>:<url name>
sumber
urls.py
maka @ dariusz-niespodziany Anda akan langsungreverse
-able. Tetapi jika Anda menggunakan namespace, makaresolver_match.url_name
tidak dapat langsung-reverse
dapat. Jadi, Anda harus menambahkan namespace sendiri. Jadi, alih-alih melakukannya sendiri, Django sudah menyetel.view_name
saat inisialisasi.Ini dapat dicapai melalui:
request.resolver_match.url_name
Django> 1.8
sumber
Klarifikasi dari pertanyaan: "Dalam pandangan, bagaimana Anda mendapatkan nama dari pola url yang mengarah ke sana, dengan asumsi persis ada satu pola url seperti itu."
Ini mungkin diinginkan karena alasan yang disebutkan: dari dalam tampilan, kami menginginkan cara KERING untuk mendapatkan url ke tampilan yang sama (kami tidak ingin harus mengetahui nama pola url kami sendiri).
Jawaban singkat: Ini tidak cukup sederhana untuk mengajar kelas Anda, tetapi mungkin akan menyenangkan bagi Anda untuk melakukannya dalam satu atau dua jam dan muntah di GitHub.
Jika Anda benar-benar ingin melakukan ini, Anda harus membuat subkelas RegexURLResolver dan memodifikasi metode penyelesaian untuk mengembalikan pola yang cocok (dari mana Anda bisa mendapatkan nama pola) alih-alih pasangan tampilan dan kata kunci / nilai. http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142
Anda kemudian dapat membuat dekorator atau mungkin lebih tepat middleware yang menggunakan subkelas ini untuk mendapatkan nama pola dan menyimpan nilai itu di suatu tempat dalam permintaan sehingga tampilan dapat menggunakannya.
Jika Anda benar-benar ingin melakukannya dan mengalami masalah, beri tahu saya dan saya mungkin bisa membantu.
Untuk kelas Anda, saya hanya akan meminta mereka melakukan hardcode nama pola dalam tampilan atau template. Saya yakin ini adalah cara yang dapat diterima untuk melakukannya.
Pembaruan: Semakin saya memikirkan hal ini, semakin saya tidak menyarankan untuk mencoba mendapatkan nama urlpattern dalam tampilan. Parameter urlpattern cukup independen dari parameter tampilan yang mereka tunjuk. Jika Anda ingin mengarahkan ke url tertentu, Anda perlu mengetahui cara kerja pola url, bukan hanya cara kerja tampilan. Jika Anda ingin mengetahui bagaimana pola url bekerja, Anda mungkin juga harus mengetahui nama dari pola url tersebut.
sumber
Coba saja
request.path
. Itu akan membuat jalur saat ini diminta.sumber
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
sumber
Pertanyaan Anda sedikit tidak jelas, tetapi http://docs.djangoproject.com/en/dev/topics/http/urls/ kemungkinan akan memberikan penjelasan tentang apa yang Anda cari.
Sangat berguna untuk mencatat bagaimana Django memproses permintaan:
Ketika seorang pengguna meminta halaman dari situs Anda yang didukung Django, ini adalah algoritma yang diikuti sistem untuk menentukan kode Python mana yang akan dijalankan:
Jika Anda hanya mengejar jalur lengkap, Anda dapat mencoba:
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
Saya harap itu membantu - ini menunjukkan bagaimana menggunakan modul URLconf, dan mudah-mudahan akan membantu mengarahkan Anda ke arah yang benar.
sumber