2017-10-30 2 views
0

Ich versuche einen Django-Oscar-Shop zu einer bestehenden Django-Website hinzuzufügen.Wie kann man Django-Oscar neben anderen Apps haben?

Mein Problem ist, dass die Vorlagen der beiden irgendwie kollidieren, so dass ich entweder die bestehende Website oder den Shop sehen kann, aber nicht beides. Hier

ist das übergeordnete urls.py:

from django.conf.urls import include, url 
from django.contrib import admin 
from oscar.app import application 

urlpatterns = [ 
    url(r'^admin/', include(admin.site.urls)), 

    url(r'^', include('main.urls')), 

    # oscar 
    url(r'^shop/', include(application.urls)), 
] 

Und in den Einstellungen:

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

       'oscar.apps.search.context_processors.search_form', 
       'oscar.apps.promotions.context_processors.promotions', 
       'oscar.apps.checkout.context_processors.checkout', 
       'oscar.apps.customer.notifications.context_processors.notifications', 
       'oscar.core.context_processors.metadata', 

       'main.context_processors.google_analytics' 
      ], 

      'loaders': [ 
       'django.template.loaders.app_directories.Loader', 
       'django.template.loaders.filesystem.Loader', 
      ], 
     }, 
    }, 
] 

Wenn ich die Reihenfolge der Lade wechseln, entweder in der ursprünglichen Website (in app 'main'), oder der Oscar-Shop, kann nicht mehr betreten/angesehen werden. Ich bin mir also nicht sicher, was für ein esoterisches Detail ich übersehe, und die Dokumente decken das nicht ab. Prost.

+0

Was genau schief geht - können die Vorlagen nicht vollständig geladen werden oder wird nur die falsche Vorlage gerendert? Welche Template-Struktur haben Sie? Wie heißt Ihre Basisvorlage? – solarissmoke

+0

index.html, erbt von base.html, ist ein gutes Beispiel. Wenn ich mit dem App_directories_loader zuerst auf den Stamm zugreife, wird er geladen. Wenn ich Loader wechsle, scheint es eine index.html zu haben, die von Oscar kommt (das inhaltlich leer ist, aber ein Oscar-Favicon hat). Also im Grunde die falsche Vorlage Rendering, irgendwie scheinen sie gleich benannt zu sein. Ich weiß nicht, wie ich das beheben würde, weil Oscar-Vorlagen nicht in meiner Kontrolle sind. – Meiji

Antwort

1

Das Problem, das Sie haben, ist, dass Ihre Vorlagennamen mit Oscars in Konflikt stehen. Oscar hat seine eigene base.html, was der Vorlagenlader finden wird, wenn Sie diesen Lader zuerst auflisten, anstatt Ihren eigenen base.html. Django benutzt das erste, das es findet.

Dies ist ein known issue with Oscar - leider gibt es keine abwärtskompatible Möglichkeit, es zu reparieren, und so wurde es seit einiger Zeit nicht angesprochen.

Das Ändern des Oscar-Verhaltens ist ziemlich schwierig, deshalb würde ich vorschlagen, dass Sie versuchen, stattdessen Ihre Template-Struktur zu ändern. Insbesondere sollten Sie alle Ihre App-Vorlagen mit einem Namensraum versehen. Wenn Ihre App myapp heißt, legen Sie die Basisvorlage in myapp/templates/myapp/base.html. Sie würden dann in anderen Vorlagen auf {% extends 'myapp/base.html' %} verweisen. Ähnlich setzen Sie alle anderen Vorlagen in templates/myapp/.

Dies wird sicherstellen, dass Ihre Vorlagen nicht mit Oscars kollidieren, und das Problem sollte verschwinden.

+0

Nun, ich frage mich, ob ich einen Fehler mache, indem ich Oscar benutze. Es schien einfach die beliebteste Shop-Bibliothek zu sein, aber es fällt mir ein wenig ungeschickt auf (ehrlich gesagt, auch Django, ich muss bereits 'main/static/main' für statische Dateien schreiben und dann --collectstatic). Ich muss noch mehr nach anderen einfacheren Bibliotheken recherchieren, wenn sie existieren und populär sind. Ich frage mich, ob ich vielleicht nur in den sauren Apfel beißen und zu Rails wechseln sollte. – Meiji

+0

* Ich muss schon 'main/static/main' für statische Dateien schreiben * - nicht sicher, was du damit meinst, aber es hört sich nicht so an, als würdest du es richtig machen. Auch 'collectstatic' wird nur für den Einsatz in der Produktion benötigt. Wenn Sie Ihr Projekt korrekt eingerichtet haben, sollte es in der Entwicklung nicht benötigt werden. – solarissmoke

+0

Ja, ich habe genug Stunden verbrennen lassen, um es auf meiner Maschine laufen zu lassen, genauso wie in der Produktion, also mache ich es jetzt genauso für beide. Collectstatic sammelt alle statischen Dateien der Apps in das root/static Verzeichnis. Wenn also zwei Apps eine statische Datei mit demselben Namen haben, ist das ein Konflikt. Also das Haupt/Statische/Hauptkram, was eigentlich der Dokumentation entsprach. – Meiji

Verwandte Themen