2017-02-22 10 views
1

Я почти преодолением закончить мой Theme Selector с Django но я блокировании на одной точке:Handle динамический staticfiles путь с Django

==> Я не прийти, чтобы получить динамический staticfiles путь в соответствии с результат формы, заданный пользователем.

поясню процесс:

Пользователь заполняет форму Django, проверяя коробку RadioSelect. У него есть выбор между двумя вариантами:

  • Datasystems
  • Cameroun

Оба варианта соответствуют 2 темам, которые имеют два Differents фона цвета. Datasystems - голубой & белый и Cameroun зеленый & красный.

Итак, я поднимаю результат формы, соответствующий одной из оба темы, которые расположены в статических файлах:

|--- app1 
|--- app2 
├── static 
│   └── Theme 
│    ├── Cameroun 
│    │   ├── css 
│    │   │   ├── Base.css 
│    │   │   ├── Base_Accueil.css 
│    │   │   ├── Base_Birthcertificate.css 
│    │   │   ├── Base_Configurations.css 
│    │   │   ├── Base_Identity.css 
│    │   │   ├── Base_Mairie.css 
│    │   │   ├── Base_Recensement.css 
│    │   │   └── Base_Table.css 
│    │   └── images 
│    │    ├── admin.png 
│    │    ├── chantier.jpeg 
│    │    ├── chantier.png 
│    │    ├── employe?\201.png 
│    │    ├── logo.png 
│    │    ├── maire.png 
│    │    ├── officier.png 
│    │    ├── stats.jpeg 
│    │    └── visiteur.png 
│    └── Datasystems 
│     ├── css 
│     │   ├── Base.css 
│     │   ├── Base_Accueil.css 
│     │   ├── Base_Birthcertificate.css 
│     │   ├── Base_Configurations.css 
│     │   ├── Base_Identity.css 
│     │   ├── Base_Mairie.css 
│     │   ├── Base_Recensement.css 
│     │   └── Base_Table.css 
│     └── images 
│      ├── admin.png 
│      ├── chantier.jpeg 
│      ├── chantier.png 
│      ├── employe?\201.png 
│      ├── logo.png 
│      ├── maire.png 
│      ├── officier.png 
│      ├── stats.jpeg 
│      └── visiteur.png 

В моем settings.py файла, у меня есть статический путь:

STATIC_URL = '/static/' 
STATICFILES_DIRS = (os.path.join(BASE_DIR, "/Etat_civil/static/Theme/"),) 

Я использую templates_tag, но я не уверен, что если моя функция может быть написать так:

from django import template 
from Configurations.models import Theme 

register = template.Library() 

def GetTheme(Theme): 

    mytheme = Theme.objects.all().last() 
    return mytheme in Theme.objects.all() 

В моих шаблонах, я хотел бы написать статический путь, динамический путь зависит от переменной темы, выбранной пользователем:

<!DOCTYPE html> 
<html> 
    <head> 

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

    <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" /> 
    {% if mytheme == 'Datasystems' %} 
    <link rel="stylesheet" type="text/css" href="{% static 'Datasystems/css/Base_Accueil.css' %}"/> 
    {% elif mytheme == 'Cameroun' %} 
    <link rel="stylesheet" type="text/css" href="{% static 'Cameroun/css/Base_Accueil.css' %}"/> 
    {% endif %} 

    etc .... 

Я немного потерял. Я думаю, что мой процесс может работать очень хорошо, но, возможно, что-то не написано как пифонический или что-то еще.

Я старался быть кратким и конкретным.

Спасибо авансом

ответ

4

Вы можете использовать get_static_prefix template tag сделать это полу-вручную:

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

У меня очень плохой стиль CSS. Это означает, что мой файл template.html не видит правильный путь staticfiles. Возможно ли, что функция GetTheme в файле template_tags неверна? – Deadpool

+0

Ну, да; этот код не имеет особого смысла и возвращает логическое значение (которое всегда верно, поскольку тема, которую вы только что получили, всегда будет находиться в Theme.objects.all()). Что именно вы пытаетесь сделать там? –

+0

Хорошо. У меня есть таблица, которая называется 'Тема' с двумя компонентами:' id', 'favorite_theme'. Каждый раз, когда я заполняю тему, я добавляю строку в эту таблицу (прямо сейчас). Поэтому, чтобы получить выбранную тему, я собираю последнюю строку в таблице. В этой строке я извлекаю 'favorite_theme', который является' Datasystems' или 'Cameroun', и эта переменная должна находиться в моем статическом пути. – Deadpool

1

Я нашел решение, основанное на различных ответов, и я объясню, что я сделал. Это решение работает для меня с Django 1.10 и для этого используется context_processors.

Первый шаг: Изменить 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")} 

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

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

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

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

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

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

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