Tidak jelas bagi saya bagaimana cara terbaik mengakses parameter URL dalam tampilan berbasis kelas di Django 1.5.
Pertimbangkan hal berikut:
Melihat:
from django.views.generic.base import TemplateView
class Yearly(TemplateView):
template_name = "calendars/yearly.html"
current_year = datetime.datetime.now().year
current_month = datetime.datetime.now().month
def get_context_data(self, **kwargs):
context = super(Yearly, self).get_context_data(**kwargs)
context['current_year'] = self.current_year
context['current_month'] = self.current_month
return context
URLCONF:
from .views import Yearly
urlpatterns = patterns('',
url(
regex=r'^(?P<year>\d+)/$',
view=Yearly.as_view(),
name='yearly-view'
),
)
Saya ingin mengakses year
parameter dalam tampilan saya, jadi saya bisa melakukan logika seperti:
month_names = [
"January", "February", "March", "April",
"May", "June", "July", "August",
"September", "October", "November", "December"
]
for month, month_name in enumerate(month_names, start=1):
is_current = False
if year == current_year and month == current_month:
is_current = True
months.append({
'month': month,
'name': month_name,
'is_current': is_current
})
Bagaimana cara terbaik mengakses parameter url di CBV seperti di atas yang merupakan subkelas TemplateView
dan di mana idealnya menempatkan logika seperti ini, mis. dalam suatu metode?
extra_context
dikt sederhana didjango2
, lihat di siniJawaban:
Untuk mengakses parameter url dalam tampilan berbasis kelas, gunakan
self.args
atauself.kwargs
lebih Anda akan mengaksesnya dengan melakukanself.kwargs['year']
sumber
year = self.kwargs['year']
dalam tampilan yang saya dapatkanNameError: self not defined
.NameError
, di mana Anda coba lakukanyear = self.kwargs['year']
? Anda harus melakukannya dengan metode, Anda tidak dapat melakukannya di tingkat kelas. Jadi misalnya, Anda menggunakan aTemplateView
yang berarti Anda akan melakukan logika dalamget_context_data
penggantian.def __init__(self):
fungsi di kelas jika Anda ingin mengaksesnya di luar fungsi lain.Jika Anda melewatkan parameter URL seperti ini:
Anda dapat mengaksesnya dalam tampilan berbasis kelas dengan menggunakan
self.request.GET
(tidak disajikan dalamself.args
atau dalamself.kwargs
):class MyClassBasedView(ObjectList): ... def get_queryset(self): order_by = self.request.GET.get('order_by') or '-created' qs = super(MyClassBasedView, self).get_queryset() return qs.order_by(order_by)
sumber
qs=<Object>.objects.<method>
Saya menemukan solusi elegan ini, dan untuk django 1.5 atau lebih tinggi, seperti yang ditunjukkan di sini :
Di views.py Anda:
from django.views.generic.base import TemplateView class Yearly(TemplateView): template_name = "calendars/yearly.html" # Not here current_year = datetime.datetime.now().year current_month = datetime.datetime.now().month # dispatch is called when the class instance loads def dispatch(self, request, *args, **kwargs): self.year = kwargs.get('year', "any_default") # other code # needed to have an HttpResponse return super(Yearly, self).dispatch(request, *args, **kwargs)
Solusi pengiriman ditemukan dalam pertanyaan ini .
Karena tampilan telah diteruskan dalam konteks Template, Anda tidak perlu mengkhawatirkannya. Dalam file template Anda yearly.html, dimungkinkan untuk mengakses atribut tampilan tersebut hanya dengan:
Anda dapat mempertahankan urlconf Anda apa adanya.
Perlu disebutkan bahwa mendapatkan informasi ke dalam konteks cetakan anda menimpa get_context_data (), jadi entah bagaimana merusak aliran kacang aksi django .
sumber
Sejauh ini saya hanya dapat mengakses parameter url ini dari dalam metode get_queryset, meskipun saya hanya mencobanya dengan ListView bukan TemplateView. Saya akan menggunakan parameter url untuk membuat atribut pada instance objek, lalu menggunakan atribut itu di get_context_data untuk mengisi konteks:
class Yearly(TemplateView): template_name = "calendars/yearly.html" current_year = datetime.datetime.now().year current_month = datetime.datetime.now().month def get_queryset(self): self.year = self.kwargs['year'] queryset = super(Yearly, self).get_queryset() return queryset def get_context_data(self, **kwargs): context = super(Yearly, self).get_context_data(**kwargs) context['current_year'] = self.current_year context['current_month'] = self.current_month context['year'] = self.year return context
sumber
context['year'] = self.kwargs['year']
? Ini harus dapat diakses di mana saja di kelas.Bagaimana kalau menggunakan dekorator Python untuk membuat ini bisa dimengerti:
class Yearly(TemplateView): @property def year(self): return self.kwargs['year']
sumber