2017-02-22 3 views
1

Ich Überwindung fast meinen Theme Selector mit Django zu beenden, aber ich bin Blockierung in einem Punkt:Griff dynamischen Static Pfad mit Django

==> Ich komme nicht einen dynamischen Pfad Static zu bekommen nach dem Formularergebnis vom Benutzer angegeben.

werde ich den Prozess erklären:

Benutzer füllt ein Django Formular ein RadioSelect Box durch Überprüfung. Er hat die Wahl zwischen zwei Möglichkeiten:

  • Datasystems
  • Cameroun

Beide Optionen zu 2 Themen entsprechen, die zwei differents Hintergrund-Farben haben. Datasystems ist blau & weiß und Kamerun ist grün & rot.

Also, ich das Formular Ergebnis sowohl Thema zu einem entsprechenden aufzunehmen, die in statischen Dateien befinden:

|--- 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 

In meiner settings.py Datei, ich habe die statischen Pfad wie folgt aus:

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

ich verwende templates_tag aber ich bin nicht sicher, ob meine Funktion so schreiben könnte:

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() 

In meinen Vorlagen, würde Ich mag statischen Pfad schreiben, wie ein dynamischer Pfad auf variable Thema durch den Benutzer ausgewählt wird, hängt:

<!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 .... 

Ich bin ein bisschen verloren. Ich denke, dass mein Prozess ziemlich gut funktionieren könnte, aber vielleicht ist etwas nicht als pythonischer Weg oder etwas anderes geschrieben.

Ich versuchte, präzise und spezifisch zu sein.

Danke von vorab

Antwort

4

Sie die get_static_prefix template tag diese semi-manuell zu tun verwenden:

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

Ich bekomme eine sehr schlechte CSS-Stylesheet. Dies bedeutet, dass meine Datei template.html den korrekten Pfad für statische Dateien nicht anzeigt. Ist es möglich, dass die GetTheme-Funktion in der Datei template_tags falsch ist? – Deadpool

+0

Nun, ja; dieser Code macht überhaupt keinen Sinn und gibt einen booleschen Wert zurück (was immer wahr ist, da das Thema, das Sie gerade abgerufen haben, immer in Theme.objects.all() enthalten ist). Was genau versuchst du da zu machen? –

+0

Ok. Ich habe eine Tabelle namens 'Theme' mit zwei Komponenten:' id', 'favorite_theme'. Jedes Mal, wenn ich das Theme-Formular ausfülle, füge ich eine Zeile in diese Tabelle ein (bis jetzt). Um das gewählte Thema zu bekommen, nehme ich die letzte Reihe in der Tabelle auf. In dieser Zeile extrahiere ich 'favorite_theme', was' Datasystems' oder 'Kamerun' ist und diese Variable muss in meinem statischen Dateipfad liegen. – Deadpool

1

ich die Lösung auf verschiedene Antworten basierend gefunden und ich werde erklären, was ich getan habe. Diese Lösung funktioniert für mich mit Django 1.10 und context_processors verwenden, um dies zu tun.

Erster Schritt: Ändern settings.py Datei

Ich veränderte meine settings.py Datei und genauer TEMPLATES PART.Für den Augenblick diese Änderung nur für Accueil Anwendung ist, aber ich werde diesen Prozess für alle Anwendungen erweitern:

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

:

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'], 
     }, 
    }, 
] 

Mit dem folgenden Beispiel wird die letzte Zeile wie folgt geschrieben werden Zweiter Schritt: Erstellen Sie context_processers.py Datei in meiner Anwendung

Ich habe diese neue Datei in meinem Anwendungsteil erstellt.

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")} 

Dritter Schritt: Ändern Sie meine base.html für Accueil Anwendung

Ich habe eine Basisvorlage, die meine Accueil Anwendung verwalten Wie oben, wird es für andere Anwendungen erweitern sein. Ich habe Header zu schreiben, wie dies ich den context_processors Variable Konto nehmen will:

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

Durch diese Art und Weise kann ich die letzte Zeile aus meinem Theme Tisch holen und setzen Sie die Variable in {{ mytheme }}. Dann habe ich meine gute Themen-URL erstellt. Jetzt wird Django alle CSS-Dateien im guten Repository durchsuchen.

Ab jetzt, wenn ich die Formel mit einer Auswahl zwischen zwei Themen: Datasystems und Kamerun füllen und meine Wahl bestätigen, wird das neue Thema berücksichtigt und die globale Hintergrundfarbe ändert sich aufgrund meiner Themenwahl!

Hopfull wird meine Antwort anderen Programmierern helfen!

Vielen Dank für alle :)

Verwandte Themen