Краткое добавление переменных в контекстный словарь Django

#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