2013-08-16 8 views
19

Ich habe wirklich Probleme mit dieser ganzen App-Idee. Ich lese viele Tutorials und Style Guides und ich weiß, dass ich versuchen sollte, spezialisierte Apps zu erstellen, die genau eine Sache machen. Das alles macht Sinn, wenn man sich ein einfaches Tutorial-Projekt anschaut, aber sobald es zu einem komplexen realen Projekt kommt, kann ich nicht feststellen, wie ich die Grenzen zwischen verschiedenen Apps ziehen soll.Django: Best Practice für die Aufteilung von Projekten in Apps

Eines der Probleme ist, dass ich eine Website (oder mehrere Websites) haben möchte, wo der Benutzer viele verschiedene Sachen sieht. Inhalte, die aus verschiedenen Apps stammen sollten, wenn die App-Designregeln befolgt werden. Wie würde ich so etwas realisieren? Meine erste Idee war, eine App namens ui zu erstellen, die nur ALLE Ansichten behandelt, die tatsächlich zu einer Vorlage führen, und alle anderen Apps enthalten die Modelle und Hilfsfunktionen. Aber ich befürchte, dass die ui App viel zu groß werden wird.

Ihnen ein kleines Beispiel geben: Lasse Ich möchte einen Ort haben, wo der Benutzer die folgenden Aufgaben ausführen kann:

  • Wählen Sie ein Thema
  • Upload einige Optionen zu dem ausgewählten Thema eingestellt Dateien, die mit dem Konto
  • einige der hochgeladenen Dateien auf das Thema zugeordnet sind
  • Datensatz einige Audio zuordnen, die auf das Thema bezogen werden
  • Rechts

jetzt, ich würde drei Anwendungen erstellen:

  1. Themen (enthält das Thema Modell und einige verwandte Modelle)
  2. Ressourcen (enthält das Ressourcenmodell, Griffe Uploads)
  3. Audio (Griffe alle das Audio-Aufnahme und Verarbeitung Material)

Aber dann würde ich eine Art von main oder ui App benötigt diese ap zu handhaben, wie ps interagieren und erstellen die eigentliche Seite, an der alle Apps beteiligt sind.

Also, gibt es einen "richtigen" Weg, dies zu tun? Oder gibt es irgendwelche Muster, die ich benutzen kann? Ich würde auch Links zu guten Quellen zu diesem Thema schätzen, obwohl ich schon einige gelesen habe.

Antwort

7

Sie müssen nur sicherstellen, Ihre Struktur macht Sinn zu Sie.

Es ist nicht erforderlich, für jede Funktion, die an einen anderen Teil der Projektlogik gebunden ist, eine neue Anwendung zu erstellen.

Wiederverwendbare Apps sind eine ganz andere Geschichte, ihr Code sollte die Implementierung in gewissem Maße nicht bewusst sein.

Werfen Sie einen Blick auf Django's structure für Inspiration

Ein mögliches Layout für Ihr Beispiel:

project_root/ 
    project/ 
     __init__.py 
     settings.py 
     urls.py 
     templates/ 
      app1/ # override stuff 
     static/ 
     media/ 
    app1/ 
     __init__.py 
     admin/ # as a package 
      __init__.py 
      subjects.py 
      resources.py 
      # etc 
     models/ # as a package 
      subjects.py 
      resources.py 
      # etc 
     managers/ 
      __init__.py 
      subjects.py 
      resources.py 
      # etc 
     services/ 
      __init__.py 
      audio.py # upload handler etc 
     views/ 
      __init__.py 
      subjects.py 
     urls/ 
      __init__.py 
      subjects.py 
     templates/ 
      app1/ 
       subject_list.html # override at project level 
     static/ 
      app1/ 
       css/ 
        subject.css # override at project level 
    app2/ 
     __init__.py 
     models.py # holds a Member model or whatever you require 
    manage.py 
+0

vielen dank! vielleicht überlegte ich das ganze App-Muster ein wenig. aber das macht eigentlich viel mehr Sinn. Eine Frage jedoch: Wie funktioniert "Override auf Projektebene"? Oder was meinst du damit? – basilikum

+0

@basilikum Djangos Vererbungssystem sucht zunächst auf der Ebene Ihres Projekts nach einer Vorlage oder einer CSS-Datei und greift dann auf die App-Ebene usw. zurück (abhängig von Ihren [Einstellungen] (https://docs.djangoproject.com/en/1.5/ref/ contrib/staticfiles/# staticfiles-finders, von oben nach unten) Dies ist von großem Nutzen, wenn Sie Teile Ihrer Code-Cross-Projekte wiederverwenden, wo Sie keine projektspezifischen Style/Template-Hooks verwenden möchten. Wohlgemerkt, package deep-Modelle erfordern Import-Anweisungen in der init-Datei und die Verwendung des 'app_label'-Arguments in der" Meta "-Klasse eines Modells. –

+0

Danke nochmal! Ich habe bereits etwas von meinem Code umstrukturiert und es ist schon viel sauberer für mich. – basilikum

5

ich die beste Art und Weise denken, eine App zu begrenzen, um die Art und Weise entspricht in etwa begrenzen Sie eine Klasse auf eine Objected Oriented Programmiersprache.Anstelle von Variablen und Methoden denken Sie an Modelle bzw. Ansichten:

Modelle sind der Status des Objekts, Ansichten werden verwendet, um den Status des Objekts anzuzeigen und mit ihm zu interagieren.

Meine Faustregel ist, erstellt eine App Hilfe zu encapsulate eine bestimmte Reihe von Modellen? Wenn das der Fall ist, versuche ich es zu erstellen.

Verwandte Themen