2017-07-17 1 views
0

Bin ein Neuling in Django und entwickle meine erste Website mit diesem Framework. Eine solche Website muss über die Links für soziale Netzwerke oben rechts auf dem Bildschirm entlang ALLER Bereiche verfügen. Um das zu erreichen, habe ich Tabelle in models.py mit zwei Feldern gemacht: Social Network Link und Fontawesome Icon.Wie können einige Daten in allen Bereichen einer Website mit django sichtbar gemacht werden?

Jeder Bereich der Website wird mit einer Vorlage gerendert und alle Vorlagen erstrecken sich von nur einer Basisvorlage. Diese Basisvorlage ist diejenige, die die sozialen Netzwerk-Links enthalten muss

Die einzige Möglichkeit, dass ich weiß, wie diese Links in allen Abschnitten angezeigt werden, ist die Übergabe an die Vorlage in jeder Ansicht. Das ist gegen die Regel DRY (Do not Repair Yourself). Gibt es eine Möglichkeit, sie nur einmal zu übergeben und sie für alle Websites sichtbar zu machen?

Antwort

0

Writing your own context processors

Es gibt nur zwei der Regel gibt es ...

  1. nimmt nur ein Argument, das request
  2. ist Must-Wörterbuch

context_processors.py

zurückkehren
def database_social_links(request): 
    social_links = SocialLinks.objects.all() 
    return {'social_links': social_links } 

Aktualisieren Sie Ihre settings.py

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [ 
      # insert your TEMPLATE_DIRS here 
     ], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       # Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this 
       'your_app.context_processors.database_social_links', 
       # list if you haven't customized them: 
       'django.contrib.auth.context_processors.auth', 
       'django.template.context_processors.debug', 
       'django.template.context_processors.i18n', 
       'django.template.context_processors.media', 
       'django.template.context_processors.static', 
       'django.template.context_processors.tz', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

Und in Ihrem base.html oder was auch immer ...

{% for links in social_links %} 
    {{ link.name }} {{ link.font_awesome }} 
{% endfor %} 
+0

Vielen Dank für Ihre Antwort Raja folgen! Sie sagen also, dass ich diese Daten nicht über "views.py" weitergeben muss? – Captain

+0

Ja, das stimmt. Das Konzept der benutzerdefinierten Kontextprozessoren sieht vor, dass ein definiertes Datenwörterbuch injiziert wird, wenn die Ansicht ohne Erwähnung ausgeführt wird. Das wird also in jeder Vorlage verfügbar sein. –

+0

Aber Sie erhalten es aus der Datenbank, also seien Sie vorsichtig mit dieser Skalierung und all den Dingen. Bei jeder Seitenanforderung erhalten Sie die Werte der Datenbank. Wenn Sie mich fragen, vermeide ich das besser. Stattdessen verwende ich redis wie Datenbank für bessere bekommen ... :) –

Verwandte Themen