2017-02-22 3 views
0

Согласно моему другому вопросу о том: Handle dynamic staticfiles path with DjangoОтображение переменного из тегов файла или context_processors в Django шаблоне

Я не найти способ решить мою проблему. Я хотел бы добавить в свой HTML-шаблон переменную, соответствующую запросу Django.

Я уже использовал теги, чтобы разрешить некоторые части в зависимости от групп пользователей.

Мой файл tags.py выглядит следующим образом:

from django import template 
from django.contrib.auth.models import Group 
from Configurations.models import Theme 

register = template.Library() 

@register.filter(name='has_group') 
def has_group(user, group_name): 
    group = Group.objects.get(name=group_name) 
    return group in user.groups.all() 

@register.assignment_tag 
def GetTheme(Theme): 

    mytheme = Theme.objects.values_list('favorite_theme').last() 
    return mytheme 

И мой шаблон HTML выглядит следующим образом:

<!DOCTYPE html> 
<html> 
    <head> 

    {% load staticfiles %} 
    {% load static %} 
    {% load user_tags %} 

    <title> DatasystemsEC - Accueil </title> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

    <link rel="stylesheet" type="text/css" href="{% get_static_prefix %}{{ mytheme }}/css/Base_Accueil.css"/> 

Цель состоит в том, чтобы подобрать переменную mytheme в моем файле tags.py и вставки это в моем html-шаблоне.

В свою очередь, я получаю все время:

#Look double // in my url 
http://localhost:8000/static//css/Base_Accueil.html 

#I should get 
http://localhost:8000/static/{{ mytheme }}/css/Base_Accueil.html 

Но после долгой паузы для поиска решения и щедростью от @DanielRoseman в моем предыдущем посте, я не найти решение.

Возможно, у кого-то были индексы или идеи?

Спасибо

+0

Извините, если это глупый вопрос, но вместо того, чтобы делать пользовательские тег, почему вы не просто добавить 'mytheme' в контекст шаблона в представлении? Что-то вроде этого 'context ['mytheme'] = Theme.objects.values_list ('favorite_theme'). Last()'. Кроме того, если у каждого пользователя есть своя тема, вы не должны фильтровать тему только для текущего пользователя: 'Theme.objects.filter (user = request.user) .values_list ('favorite_theme'). Last()' – neverwalkaloner

+0

Это совсем не так. глупый вопрос ! Тема должна применяться повсюду на моем сайте django. Выбранная тема меняет цвет фона, ... на всех страницах шаблона html. Только администратор (то есть я) может изменить тему, просто проверив RadioSelectBox. Если я поставил 'mytheme', я должен сделать это во всех представлениях (около 10 приложений) и для каждой функции правильно? Вот почему файл тегов кажется лучшей идеей, но я могу сделать ошибку ^^ – Deadpool

+1

Ну, попробуйте исправить пару вещей. Прежде всего удалите аргумент из 'GetTheme', чтобы избежать переопределения имени' Theme': 'def GetTheme():'. Во-вторых, перед использованием этого параметра присвойте переменной 'mytheme' в шаблоне:' {% GetTheme как mytheme%} '. – neverwalkaloner

ответ

1

вы можете написать пользовательские context_processors.

settings.py

TEMPLATES = [ 
    { 
    'BACKEND': 'django.template.backends.django.DjangoTemplates', 
    'DIRS': [os.path.join(BASE_DIR, 'web', 'templates'),], 
    'APP_DIRS': True, 
    'OPTIONS': { 
     'context_processors': [ 
      'django.template.context_processors.debug', 
      'django.template.context_processors.request', 
      'django.contrib.auth.context_processors.auth', 
      'django.core.context_processors.media', 
      'django.core.context_processors.static', 
      'django.contrib.messages.context_processors.messages', 
      'myapp.contextprocessor.mytheme', 
     ], 
    }, 
    }, 
] 

contextprocessor.py

def mytheme(request): 
    return {'mytheme': 'red'} 
+0

Я последовал вашему примеру и по этой ссылке: http://stackoverflow.com/questions/32828536/django-no-module-named-context-processors-error-after-reboot. Но таблица стилей CSS не появляется. – Deadpool

+0

«{{mytheme}}' печатает на шаблоне как «красный»? –

+0

Я нашел решение на основе вашего ответа и некоторых документов. Я напишу целый ответ, чтобы сделать это;) Спасибо – Deadpool

2

Я нашел решение, основанное на различных ответов, и я объясню, что я сделал. Это решение работает для меня с Django 1.10:

Первый шаг: Изменить файл settings.py

Я изменил мой settings.py файл и более точно TEMPLATES PART. На данный момент, эта модификация только для применения Accueil но продлит этот процесс для всех приложений:

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [os.path.join(BASE_DIR, 'templates')], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'debug' : DEBUG, 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
       'myapp.context_processors.context_processors_name_function'], 
     }, 
    }, 
] 

на следующем примере, последняя строка будет записана следующим образом:

# 'myapp.context_processors.context_processors_name_function' 
'Accueil.context_processors.GetTheme' 

Второй шаг: создать файл context_processors.py в моей заявке

Я создал этот новый файл в моей части приложения. Как и выше, будет распространяться на другие применения:

from django.conf import settings 
from Configurations.models import Theme 

def GetTheme(request): 
    return {'mytheme' : Theme.objects.values_list('favorite_theme').last()[0].encode("ascii")} 

Третий шаг: Изменить базу.html для приложения Accueil

У меня есть базовый шаблон, который управляет моим приложением Accueil. Я должен написать заголовок, как это я хочу, чтобы принять во внимание переменную context_processors:

{% load static %} 
<link rel="stylesheet" type="text/css" href="{% get_static_prefix %}{{ mytheme }}/css/Base_Accueil.css"/> 

Благодаря таким образом, я могу забрать последнюю строку из моей Theme таблицы и поместить переменную в {{ mytheme }}. Затем я создал свой хороший URL-адрес темы. Теперь Django будет искать весь файл css в хорошем репозитории.

Отныне, когда я заполняю формуляр между двумя темами: Datasystems и Cameroun и проверяю свой выбор, учитывается новая тема и глобальное изменение цвета фона из-за моего выбора темы!

Hopfully мой ответ поможет другим программистам!

Спасибо за все :)

Смежные вопросы