#python #django #dictionary
#python #django #словарь
Вопрос:
Документация Django предлагает добавлять переменные в контекстный словарь в представлениях на основе классов следующим образом:
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(PublisherDetail, self).get_context_data(**kwargs)
# Add in a QuerySet of all the books
context['book_list'] = Book.objects.all()
return context
У меня часто бывает много переменных в моей контекстной функции gather, поэтому мой код в конечном итоге выглядит так:
def get_context_data(self, **kwargs):
context = super(PublisherDetail, self).get_context_data(**kwargs)
a = 2
b = 'hello'
c = 75 # temp variable, not wanted in context dict
d = a * c
context['a'] = a
context['b'] = b
context['d'] = d
return context
Чтобы избежать добавления каждой переменной в контекстный словарь в отдельной строке, я начал выполнять следующее:
def get_context_data(self, **kwargs):
context = super(PublisherDetail, self).get_context_data(**kwargs)
a = 2
b = 'hello'
c = 75 # temp variable, not wanted in context dict
d = a * c
del c # delete any variables you don't want to add
context.update({k:v for k,v in locals().copy().iteritems() if k[:2] != '__' and k != 'context'})
return context
Кажется, это работает, но я не очень знаком с locals(). Есть ли какая-либо причина, по которой я не должен делать это таким образом?
Комментарии:
1. причины не делать этого … это некрасиво, трудно определить, сделали ли вы что-то не так, другим сложно прочитать ваш код (и copy() кажется ненужным).
Ответ №1:
Использовать locals
— такая плохая идея. Просто добавьте в контекст напрямую
def get_context_data(self, **kwargs):
context = super(PublisherDetail, self).get_context_data(**kwargs)
c = 75 # temp variable, not wanted in context dict
context['a'] = 2
context['b'] = 'hello'
context['d'] = context['a'] * c
return context