Não está claro para mim como é melhor acessar parâmetros de URL em visualizações baseadas em classe no Django 1.5.
Considere o seguinte:
Visão:
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'
),
)
Quero acessar o year
parâmetro em minha visão, para poder fazer lógicas como:
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
})
Qual seria a melhor forma de acessar o parâmetro url em CBVs como o acima, que é uma subclasse de TemplateView
e onde se deve colocar idealmente a lógica como esta, por exemplo. em um método?
extra_context
ditado simplesdjango2
, veja aquiRespostas:
Para acessar os parâmetros de url em visualizações baseadas em classe, use
self.args
ouself.kwargs
então você acessaria fazendoself.kwargs['year']
fonte
year = self.kwargs['year']
na vista eu receboNameError: self not defined
.NameError
, onde você está tentando fazeryear = self.kwargs['year']
? Você deveria fazer isso em um método, você não pode fazer isso no nível da classe. Então, por exemplo, você está usando umTemplateView
que significa que você faria a lógica em suaget_context_data
substituição.def __init__(self):
função da classe se quiser acessá-lo fora de outras funções.Caso você passe um parâmetro de URL como este:
Você pode acessá-lo na visualização baseada em classe usando
self.request.GET
(não é apresentado emself.args
nem emself.kwargs
):fonte
qs=<Object>.objects.<method>
Eu encontrei esta solução elegante, e para Django 1.5 ou superior, como apontado aqui :
Em suas views.py:
A solução de despacho encontrada nesta questão .
Como a visão já é passada dentro do contexto do Template, você realmente não precisa se preocupar com isso. Em seu arquivo de modelo anual.html, é possível acessar esses atributos de visualização simplesmente:
Você pode manter seu urlconf como está.
Vale a pena mencionar que obter informações no contexto do seu modelo sobrescreve o get_context_data (), então de alguma forma está quebrando o fluxo do bean de ação do django .
fonte
Até agora, só consegui acessar esses parâmetros de url de dentro do método get_queryset, embora eu só tenha tentado com um ListView, não um TemplateView. Usarei o parâmetro url para criar um atributo na instância do objeto e, em seguida, usarei esse atributo em get_context_data para preencher o contexto:
fonte
context['year'] = self.kwargs['year']
? Deve ser acessível em qualquer lugar da classe.Que tal usar decoradores Python para tornar isso inteligível:
fonte