No me queda claro cómo es mejor acceder a los parámetros de URL en vistas basadas en clases en Django 1.5.
Considera lo siguiente:
Ver:
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'
    ),
)
Quiero acceder al yearparámetro en mi vista, para poder hacer una lógica 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
        })
¿Cuál sería la mejor manera de acceder al parámetro url en CBV como el anterior que está subclasificado TemplateViewy dónde debería uno colocar idealmente la lógica como esta, por ejemplo. en un método?

extra_contextdict simple endjango2, ver aquíRespuestas:
Para acceder a los parámetros de la URL en vistas basadas en clases, use
self.argsoself.kwargspara acceder a él haciendoself.kwargs['year']fuente
year = self.kwargs['year']en la vista me saleNameError: self not defined.NameError, ¿dónde estás intentando haceryear = self.kwargs['year']? Deberías hacerlo en un método, no puedes hacerlo a nivel de clase. Entonces, por ejemplo, está utilizando un, loTemplateViewque significa que haría la lógica en suget_context_dataanulación.def __init__(self):función en la clase si quieres acceder a ella fuera de otras funciones.En caso de que pase un parámetro de URL como este:
Puede acceder a él en la vista basada en clases usando
self.request.GET(no se presenta enself.argsni enself.kwargs):fuente
qs=<Object>.objects.<method>Encontré esta elegante solución, y para django 1.5 o superior, como se señala aquí :
En su views.py:
La solución de envío que se encuentra en esta pregunta .
Como la vista ya se pasó dentro del contexto de la plantilla, realmente no necesita preocuparse por eso. En su archivo de plantilla annual.html, es posible acceder a esos atributos de vista simplemente por:
Puede mantener su urlconf como está.
Vale la pena mencionar que obtener información en el contexto de su plantilla sobrescribe get_context_data (), por lo que de alguna manera está rompiendo el flujo del bean de acción de django .
fuente
Hasta ahora, solo he podido acceder a estos parámetros de URL desde el método get_queryset, aunque solo lo probé con ListView, no TemplateView. Usaré el parámetro url para crear un atributo en la instancia del objeto, luego usaré ese atributo en get_context_data para completar el contexto:
fuente
context['year'] = self.kwargs['year']? Debe ser accesible desde cualquier lugar de la clase.¿Qué tal si usamos decoradores de Python para hacer esto inteligible?
fuente