Добавление данных из модели в extends [duplicate]

Единственное решение, о котором я могу думать, это использовать библиотеку манипуляции байт-кода, такую ​​как javassist , чтобы добавить конструктор по умолчанию.

39
задан ipegasus 27 July 2013 в 19:58
поделиться

2 ответа

То, что вы хотите, это контекстный процессор, и его очень легко создать. Предполагая, что у вас есть приложение с именем custom_app, выполните следующие шаги:

  • Добавьте custom_app в INSTALLED_APPS в settings.py (вы сделали это уже, правильно?);
  • Создайте папку context_processors.py в custom_app;
  • Добавьте следующий код в этот новый файл:
    def categories_processor(request):
     categories = Category.objects.all()            
     return {'categories': categories}
    
  • Добавьте context_processors.py в TEMPLATE_CONTEXT_PROCESSORS ] в settings.py
    TEMPLATE_CONTEXT_PROCESSORS += ("custom_app.context_processors.categories_processor", )
    

И теперь вы можете использовать {{categories}} во всех шаблонах: D

Начиная с Django 1.8

] Чтобы добавить TEMPLATE_CONTEXT_PROCESSORS, в настройках вы должны добавить следующий код:

TEMPLATES[0]['OPTIONS']['context_processors'].append("custom_app.context_processors.categories_processor")

Или включить эту строку непосредственно в клавишу OPTIONS.context_processors в настройке TEMPLATES.

78
ответ дан igorsantos07 15 August 2018 в 23:37
поделиться
  • 1
    Возможно ли сделать эту работу для любого приложения в проекте, а не просто custom_app? – jvannistelrooy 25 February 2014 в 12:00
  • 2
    @jvannistelrooy Да, это возможно. – Victor Castillo Torres 26 February 2014 в 03:18
  • 3
    Это намного легче понять, чем другие документы, доступные в других местах. Благодарю. Одно: + = не работает для меня в D1.6. Вместо этого: TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (...) – allanberry 11 May 2014 в 02:13
  • 4
    @EazyC Как вы можете видеть, параметр функции является запросом, поэтому вы можете получить зарегистрированного пользователя с помощью request.user и делать с ним все, что хотите. – Victor Castillo Torres 4 August 2015 в 04:41
  • 5
    Я думаю, вместо добавления к TEMPLATE_CONTEXT_PROCESSORS, который устарел с 1,8, вы должны добавить в список OPTIONS.context_processors в TEMPLATES. – tscizzle 10 October 2015 в 06:03

Как видно из этого примера , после Django 1.3 вы можете просто использовать render вместо render_to_response, который не требует явного пропуска процессора контекста .

def another_view_method(request):
    categories = Category.objects.all()
    return render(
        'eg/front_page.html',
        {'is_logged_in': is_logged_in(request), 'categories':categories}
    )
0
ответ дан aydow 15 August 2018 в 23:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: