LINUX.ORG.RU

context_processors

 ,


0

1

Доброго времени суток. Пытаюсь выводить теги в шаблон контекстным процессором, все бы хорошо да выводятся теги только на одной странице. Постараюсь описать проект что было понятнее.

testproj/
    manage.py
    testproj/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    base/
        __init__.py
        admin.py
        apps.py
        context_processors.py
        models.py
        tests.py
        urls.py
        views.py
        templates/
            base/
                base.html
    compilation/
        __init__.py
        admin.py
        apps.py
        models.py
        tests.py
        urls.py
        views.py
        templates/
            compilation/
                index.html
    movie/
        __init__.py
        admin.py
        apps.py
        models.py
        tests.py
        urls.py
        views.py
        templates/
            movie/
                index.html

base - отвечает за основную страницу и базовые шаблоны(тут я и задумал выводить теги)

compilation - отвечает за категории

movie - отвечает за контент

Теги выводятся только когда обращаюсь к приложению compilation.

Контекстный процессор регистрировал тут:

TEMPLATES = [
	{
		'BACKEND': 'django.template.backends.django.DjangoTemplates',
		'DIRS': [],
		'APP_DIRS': True,
		'OPTIONS': {
			'context_processors': [
				'django.template.context_processors.debug',
				'django.template.context_processors.request',
				'django.contrib.auth.context_processors.auth',
				'django.contrib.messages.context_processors.messages',
				'base.context_processors.base_sidebar',
			],
		},
	},
]

Может кто обьяснит что за полтергейст?

★★★

Контекст-процессоры не могут определять кастомные теги, они только добавляют/изменяют переменные контекста. Покажи свой контекст процессор и шаблоны, так ничего не понятно.

provaton ★★★★★ ()
Ответ на: комментарий от provaton

context_proccessors.py:

from django.utils.safestring import mark_safe
from .models import TemplateSnippet

def base_sidebar(request):
    args = {}

    for snippet in TemplateSnippet.objects.all():
        args[snippet.name] = mark_safe(snippet.content)

    return args

base.html:
<html>
{% block head %}
<head>
	<title>{{ site_title }}</title>
	<link rel="stylesheet" type="text/css" href="{% static "css/bootstrap.css" %}">
  <link rel="stylesheet" type="text/css" href="{% static "css/style.css" %}">
</head>
{% endblock head %}
<body>
{% block content %}{% endblock content %}
</body>
</head>
</html>


тег нужно выводить в base.html {{ site_title }}

xaTa ★★★ ()
Ответ на: комментарий от xaTa

Хм, не уверен что это хорошая идея спамить верхний уровень всякими переменными из БД. Лучше сделать как-то так:


def base_sidebar(request):
    snippets = {}
    for snippet in TemplateSnippet.objects.all():
        snippets[snippet.name] = mark_safe(snippet.content)
    return {'snippets': snippets}

В темплейте:

{{ snippets.site_title}}

В таком случае ты сможешь легко посмотреть все сниппеты во время дебага:

{{ snippets }}

В любом случае должно работать. Попробуй отладочный вывод или дебаггером, может выпадет что-то.

provaton ★★★★★ ()
Ответ на: комментарий от provaton

Спасибо вам, оставлю на заметку. Оказывается дело было в render_to_response() так как он не передает по умолчанию RequestContext, решил все просто render()

xaTa ★★★ ()
Ответ на: комментарий от provaton

Вот этого я не заметил просто. Только учусь.

class CompilationList(View):
    template_name = 'compilation/compilation_list.html'
 
    def get(self, request, *args, **kwargs):
        context = {}
        context['compilation_list'] = Compilation.objects.all().order_by('name')
        context['username'] = auth.get_user(request).username
 
        return render_to_response(template_name=self.template_name, context=context)

class CompilationDetail(View):
    template_name = 'compilation/compilation_detail.html'
 
    def get(self, request, *args, **kwargs):
        context = {}
        compilation = get_object_or_404(Compilation, url=self.kwargs['compilation'])
        
        context['compilation'] = compilation
        context['username'] = auth.get_user(request).username
 
        return render(request, template_name=self.template_name, context=context)

xaTa ★★★ ()
Ответ на: комментарий от xaTa

Да, лучше везде юзать рендер, _to_response это легаси.

provaton ★★★★★ ()

Может кто обьяснит что за полтергейст?

Это джанго

Siado ★★★★★ ()
Ответ на: комментарий от xaTa

Вот этого я не заметил просто. Только учусь.

Зачем использовать CBV и все равно вручную делать запросы?

gruy ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.