使用Django处理动态静态文件路径

时间:2017-02-22 13:48:42

标签: python html django

我差不多用Theme Selector来完成我的Django,但我阻止了一点:

==>我没有根据用户给出的表单结果来获取动态静态文件路径。

我将解释这个过程:

用户通过选中RadioSelect框填充Django表单。他可以选择两个选项:

  • 数据系统
  • 喀麦隆

两个选项对应于2个具有两种不同背景颜色的主题。 数据系统是蓝色&白色和 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 ....

我有点失落。我认为我的过程可以很好地工作,但也许某些东西不是用pythonic方式写的东西。

我试着简明扼要。

先谢谢你

2 个答案:

答案 0 :(得分:4)

您可以使用get_static_prefix template tag半手动执行此操作:

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

答案 1 :(得分:1)

我根据不同的答案找到了解决方案,我将解释我所做的事情。此解决方案适用于我Django 1.10并使用context_processors来执行此操作。

第一步:修改settings.py文件

我修改了我的settings.py文件,更准确地说是TEMPLATES PART。目前,此修改仅适用于Accueil Application,但我会将此过程扩展到所有应用程序:

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 for Accueil应用程序

我有一个管理我的Accueil应用程序的基本模板。我必须写这样的标题是我想要考虑context_processors变量:

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

通过这种方式,我可以从Theme表中选取最后一行,并将变量放在{{ mytheme }}中。然后,我创建了我的好主题网址。现在,Django将搜索好的存储库中的所有css文件。

从现在开始,当我在处方集中填写两个主题之间的选择:Datasystems和Cameroun并验证我的选择时,新主题会被考虑,并且由于我的主题选择而导致全局背景颜色发生变化!

我的回答几乎会帮助其他程序员!

谢谢大家:)