Ich arbeite an einer Django-Site mit der offiziellen Django 1.4-Version. Meine Website hat ein paar Apps. Eine der Apps hat ein Modell mit dem Namen Campaign
mit FKs, um in den anderen Apps zu modellieren. Wie in der Django-Referenz (https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey) vorgeschlagen, habe ich mich entschieden, die FK-Felder mit einer Zeichenfolge statt der zu definieren verwandte Modellklassen selbst, da ich in der nächsten Version zirkuläre Referenzen erwarte, und dieser Ansatz vermeidet zirkuläre Importprobleme.Django-Website mit mod_wsgi auf AWS kann kein FK-Formularfeld erstellen, da das zugehörige Modell noch nicht geladen wurde
Als ich die Site auf AWS (Amazon Web Services) mit dem BitNami djangostack 1.4 (Apache, mod_wsgi, MySQL) bereitgestellt habe, funktionierte meine bereitgestellte Site größtenteils korrekt. Auf Seiten, die Formulare für das Campaign
-Modell anzeigen, hat Django beim Erstellen eines Formularfelds, das auf einem Fremdschlüsselfeld des Modells Campaign
basiert, eine Ausnahme ausgelöst, da das betreffende Modell nicht geladen wurde. Das lustige/Gruselige ist, dass wenn ich settings.DEBUG
auf True setze (definitiv nicht etwas, das wir wollen, sobald die Seite online geht), tritt das Problem nicht mehr auf!
Die Seite funktionierte perfekt, als ich sie auf meinem lokalen Django-Entwicklungsserver ausprobierte, und sie funktionierte auch perfekt mit dem gleichen BitNami-Djangostack, der auf meiner Windows-Workstation installiert war.
Hier ist die relevante Apache-Fehlerausgabe, die ich auf der AWS-Konsole sehe.
[error] ERROR :: Internal Server Error: /campaigns/
[error] Traceback (most recent call last):
[error] File "/opt/bitnami/apps/django/lib/python2.6/site-packages/django/core/handlers/base.py", line 101, in get_response
[error] request.path_info)
... (django/wsgi blah blah)
[error] File "/opt/bitnami/apps/django/django_projects/Project/campaign/views.py", line 5, in <module>
[error] from forms import CampaignForm
[error] File "/opt/bitnami/apps/django/django_projects/Project/campaign/forms.py", line 12, in <module>
[error] class CampaignForm(forms.ModelForm):
[error] File "/opt/bitnami/apps/django/lib/python2.6/site-packages/django/forms/models.py", line 206, in __new__
[error] opts.exclude, opts.widgets, formfield_callback)
[error] File "/opt/bitnami/apps/django/lib/python2.6/site-packages/django/forms/models.py", line 160, in fields_for_model
[error] formfield = f.formfield(**kwargs)
[error] File "/opt/bitnami/apps/django/lib/python2.6/site-packages/django/db/models/fields/related.py", line 1002, in formfield
[error] (self.name, self.rel.to))
[error] ValueError: Cannot create form field for 'reward' yet, because its related model 'reward.Reward' has not been loaded yet
So, hier ist eine kurze Zusammenfassung:
- Meine Website funktioniert auf meinem lokalen Django Entwicklungs-Server, unabhängig von settings.DEBUG Wert
- Mit dem BitNami Stapel auf meinem lokalen Rechner unter Windows, Arbeiten, unabhängig von settings.DEBUG Wert
- mit dem BitNami-Stack auf AWS (Ubuntu), funktioniert es mit DEBUG = True aber nicht mit DEBUG = false
Ich verstehe was der Fehler bedeutet, aber ich verstehe nicht, warum es vorkommen, das heißt, warum das abhängige Modell nicht geladen ist. Ist jemand jemals auf ein ähnliches Problem gestoßen oder hat er Ratschläge, die mir helfen könnten, das Problem zu beheben?
Hinweis: Ich habe versucht, Google die Fehlermeldung, aber alles, was ich fand, war der Django-Quellcode, wo dieser Fehler ausgelöst wurde. Ich habe auch versucht, nach allgemeineren Abfragen wie mod_wsgi django related model
zu suchen, aber ich konnte nichts finden, das für mein Problem relevant schien.
Ist die zugehörige App in 'INSTALLED_APPS' enthalten? –
Ja, alle Apps meiner Site befinden sich in 'INSTALLED_APPS'. Spielt die Reihenfolge der Apps eine Rolle? – mbargiel
Einer der Links, die ich beim googlen gefunden habe, ist http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html. Ich bin mir nicht sicher, ob es mir helfen kann oder nicht, aber ich werde es mir ansehen. – mbargiel