Pertanyaan Django: Bagaimana cara mengidentifikasi tampilan panggilan dari template?


Versi pendek:

Apakah ada cara yang sederhana dan terintegrasi untuk mengidentifikasi tampilan panggilan dalam template Django, tanpa melewatkan variabel konteks tambahan?

Versi lama (asli):

Salah satu aplikasi Django saya memiliki beberapa pandangan yang berbeda, masing-masing dengan pola URL bernama sendiri, yang semuanya merender template yang sama. Ada jumlah kode template yang sangat kecil yang perlu diubah tergantung pada tampilan yang disebut, terlalu kecil untuk menjadi bernilai overhead pengaturan template terpisah untuk setiap tampilan, jadi idealnya saya harus menemukan cara untuk mengidentifikasi tampilan panggilan dalam template .

Saya sudah mencoba mengatur tampilan untuk meneruskan variabel konteks ekstra (misalnya "view_name") untuk mengidentifikasi tampilan panggilan, dan saya juga sudah mencoba menggunakan {% ifequal request.path "/some/path/" %} perbandingan, tetapi tak satu pun dari solusi ini tampaknya sangat elegan. Apakah ada cara yang lebih baik untuk mengidentifikasi tampilan panggilan dari template? Apakah ada cara untuk mengakses nama tampilan, atau nama pola URL?


Pembaruan 1: Mengenai komentar bahwa ini hanyalah kasus saya salah mengerti MVC, saya mengerti MVC, tapi Django bukanlah kerangka kerja MVC. Saya percaya cara aplikasi saya diatur konsisten dengan pengambilan Django tentang MVC: pandangan menggambarkan yang data disajikan, dan template menggambarkannya bagaimana data disajikan. Kebetulan saja saya memiliki sejumlah pandangan yang menyiapkan data berbeda, tetapi itu semua menggunakan templat yang sama karena data disajikan dengan cara yang sama untuk semua tampilan. Saya hanya mencari cara sederhana untuk mengidentifikasi tampilan panggilan dari template, jika ini ada.

Perbarui 2: Terima kasih atas semua jawabannya. Saya pikir pertanyaannya adalah overthought - seperti yang disebutkan dalam pertanyaan awal saya, saya sudah mempertimbangkan dan mencoba semua solusi yang disarankan - jadi saya menyaringnya menjadi "versi pendek" sekarang di bagian atas pertanyaan . Dan sekarang tampaknya bahwa jika seseorang hanya memposting "Tidak", itu akan menjadi jawaban yang paling benar :)

Perbarui 3: Carl Meyer memposting "Tidak" :) Terima kasih sekali lagi, semuanya.


32
2018-04-27 06:17


asal


Jawaban:


Tidak, dan itu akan menjadi ide yang buruk. Untuk langsung merujuk ke nama fungsi tampilan dari templat memperkenalkan kopling yang terlalu ketat antara lapisan tampilan dan lapisan template.

Solusi yang jauh lebih baik di sini adalah sistem warisan template Django. Tentukan template induk yang sama, dengan blok untuk area (kecil) yang perlu diubah dalam setiap versi tampilan. Kemudian, tentukan setiap templat tampilan untuk diperluas dari induknya dan tentukan blok tersebut secara tepat.


16
2018-04-27 15:11



Sejak Django 1.5, the url_name dapat diakses menggunakan:

request.resolver_match.url_name

Sebelum itu, Anda dapat menggunakan Middleware untuk itu:

from django.core.urlresolvers import resolve

class ViewNameMiddleware(object):  
    def process_view(self, request, view_func, view_args, view_kwargs):
        url_name = resolve(request.path).url_name
        request.url_name = url_name

Kemudian menambahkan ini di MIDDLEWARE_CLASSES, dan dalam template saya punya ini:

{% if request.url_name == "url_name" %} ... {% endif %}

mempertimbangkan RequestContext (permintaan) selalu diteruskan ke fungsi render. Saya lebih suka menggunakan url_name untuk url, tetapi seseorang dapat menggunakan resolve (). App_name dan resolve (). Func.name, tetapi ini tidak bekerja dengan dekorator - nama fungsi dekorator dikembalikan sebagai gantinya.


19
2018-01-10 11:24



Sejak Django 1.5 Anda dapat mengakses turunan dari ResolverMatch melalui request.resolver_match.

ResolverMatch memberi Anda nama url, namespace, dan sebagainya yang telah diselesaikan.


2
2018-05-17 13:57



Saya sedang mengerjakan ini untuk sistem halaman bantuan di mana saya ingin setiap tampilan untuk berkorespondensi dengan halaman bantuan di cms saya dengan halaman default yang ditampilkan jika tidak ada halaman bantuan yang ditetapkan untuk tampilan itu. Saya tersandung blog ini di mana mereka menggunakan prosesor konteks template dan beberapa python memeriksa sihir untuk menyimpulkan nama tampilan dan mengisi konteks dengannya.


1
2018-05-31 18:28



Ini terdengar seperti contoh sempurna dari pandangan umum yang dapat Anda atur.

Lihat sumber daya berikut:

Tautan ini akan membantu Anda menyederhanakan pandangan dan templat Anda dengan sesuai.


1
2018-04-27 06:42



satu solusi sederhana adalah:

def view1(req):
   viewname = "view1"
   and pass this viewname to the template context   

def view2(req):
   viewname = "view2"
   and pass this viewname to the template context   

di templat akses nama tampilan sebagai

{{viewname}} 

dan Anda juga dapat menggunakan ini dalam perbandingan.


0
2018-04-27 06:30



Kebanyakan pandangan umum - jika tidak semua - mewarisi ContextMixin yang menambahkan a view variabel konteks yang mengarah ke contoh Tampilan.


0
2018-06-02 07:16