Je ne sais pas comment il est préférable d'accéder aux paramètres d'URL dans les vues basées sur les classes dans Django 1.5.
Considérer ce qui suit:
Vue:
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'
),
)
Je veux accéder au year
paramètre dans ma vue, donc je peux faire une logique comme:
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
})
Comment accéder au mieux au paramètre url dans les CBV comme ci-dessus qui est sous-classé TemplateView
et où devrait-on idéalement placer la logique comme celle-ci, par exemple. dans une méthode?
extra_context
dict simple dansdjango2
, voir iciRéponses:
Pour accéder aux paramètres d'url dans les vues basées sur les classes, utilisez
self.args
ouself.kwargs
alors vous y accéderiez en faisantself.kwargs['year']
la source
year = self.kwargs['year']
dans la vue que j'obtiensNameError: self not defined
.NameError
, où essayez-vous de faireyear = self.kwargs['year']
? Vous devriez le faire dans une méthode, vous ne pouvez pas le faire au niveau de la classe. Ainsi, par exemple, vous utilisez unTemplateView
qui signifie que vous feriez la logique de votreget_context_data
remplacement.def __init__(self):
fonction dans la classe si vous souhaitez y accéder en dehors d'autres fonctions.Si vous transmettez un paramètre d'URL comme celui-ci:
Vous pouvez y accéder dans une vue basée sur les classes en utilisant
self.request.GET
(il n'est pas présenté dansself.args
ni dansself.kwargs
):la source
qs=<Object>.objects.<method>
J'ai trouvé cette solution élégante, et pour django 1.5 ou supérieur, comme indiqué ici :
Dans votre views.py:
La solution d'expédition trouvée dans cette question .
Comme la vue est déjà passée dans le contexte du modèle, vous n'avez pas vraiment besoin de vous en soucier. Dans votre fichier modèle annual.html, il est possible d'accéder à ces attributs de vue simplement en:
Vous pouvez garder votre urlconf tel quel.
Il vaut la peine de mentionner qu'introduire des informations dans le contexte de votre modèle écrase get_context_data (), donc cela brise en quelque sorte le flux du bean d'action de django .
la source
Jusqu'à présent, je n'ai pu accéder à ces paramètres d'url qu'à partir de la méthode get_queryset, bien que je ne l'ai essayé qu'avec un ListView et non un TemplateView. J'utiliserai le paramètre url pour créer un attribut sur l'instance d'objet, puis j'utiliserai cet attribut dans get_context_data pour remplir le contexte:
la source
context['year'] = self.kwargs['year']
? Il doit être accessible n'importe où dans la classe.Que diriez-vous d'utiliser simplement des décorateurs Python pour rendre cela intelligible:
la source