Seite 1 von 1

Problem mit Django-Models

Verfasst: Sonntag 16. Dezember 2007, 12:11
von klaus
Ich bin gerade dabei Django zu lernen und arbeite mich durch das Django book durch, aber jetzt komme ich nicht weiter. Ich bin gerade in Kapitel 6 und versuche die Admin-Site zu aktivieren, aber bei Punkt 2 kommt immer eine Fehlermeldung. In der Anleitung steht folgendes:
Install the admin models. Simply add "django.contrib.admin" to your INSTALLED_APPS setting and run "python manage.py syncdb" to install the extra tables the admin uses.

Note: When you first ran "syncdb", you were probably asked about creating a superuser. If you didn’t that time, you’ll need to run django/contrib/auth/bin/create_superuser.py to create an admin user. Otherwise you won’t be able to log into the admin interface.
Bei mir kommt folgende Fehlermeldung, wenn ich "python manage.py syncdb" ausführe:
admin.logentry: 'user' has relation with model User, which has not been installed
admin.logentry: 'content_type' has relation with model ContentType, which has not been installed
2 errors found
Außerdem wurde ich nicht gefragt, ob ich einen superuser erstellen will, als ich das erste Mal "python manage.py syncdb" ausgeführt habe.
Könnt ihr mir sagen, was ich machen muss, oder wo ich einen Fehler gemacht habe?

Verfasst: Sonntag 16. Dezember 2007, 14:36
von Leonidas
Naja, eigentlich sind alle deine Fragen in der ersten Fehlermeldung beantwortet worden. Hast du denn die Admin-Seite hinzugefügt? Hast du den Superuser angelegt?

Verfasst: Sonntag 16. Dezember 2007, 15:07
von klaus
Nein, weil ich nicht weiß, wie.
Übrigens, das erste Zitat war keine Fehlermeldung, das war der betreffende Auszug aus dem Django book.
Ich habe 'django.contrib.admin' in den Settings hinzugefügt und es funktioniert trotzdem nicht.
Einen Ordner django/contrib/auth/bin/ gibt es bei mir garnicht, die Datei creat_superuser.py befindet sich direkt im Ordner django/contrib/auth/ .
Wenn ich sie ausführen will, kommt immer ein EnvironmentError.
Ich weiß nicht, was ich sonst noch versuchen soll und es wäre sehr hilfreich, wenn mir jemand erklären könnte, wie ich dieses Problem löse.

Verfasst: Sonntag 16. Dezember 2007, 15:23
von Leonidas
Kann es sein, dass man mit `manage.py` inzwischen Superuser anlegen kann?

Das Buch kannst du aus der Sicht vergessen, das ist ziemlich out-of-date.

Verfasst: Sonntag 16. Dezember 2007, 15:43
von klaus
OK, wenn das Buch veraltet ist, wo soll ich Django dann lernen?

Es kann natürlich sein, dass man mit manage.py superuser erstellen kann, aber ich weiß nicht wie.

Verfasst: Sonntag 16. Dezember 2007, 15:55
von Leonidas
klaus hat geschrieben:OK, wenn das Buch veraltet ist, wo soll ich Django dann lernen?
Über das Online-Tutorial auf der Django-Website und die ganze restliche Dokumentation dort.
klaus hat geschrieben:Es kann natürlich sein, dass man mit manage.py superuser erstellen kann, aber ich weiß nicht wie.
So wie das mit fast allen Unix-Tools geht: ``manage.py --help``.

Verfasst: Sonntag 16. Dezember 2007, 18:03
von Panke
Hast du auch django.contrib.auth installiert?

Re: Problem mit Django-Models

Verfasst: Mittwoch 19. Dezember 2007, 19:16
von jens
,,,und auch die contenttypes middleware?
siehe: http://www.djangoproject.com/documentat ... tenttypes/

Verfasst: Mittwoch 19. Dezember 2007, 19:39
von killercup
klaus hat geschrieben:OK, wenn das Buch veraltet ist, wo soll ich Django dann lernen?
Das Django-Buch ist vor einigen Tagen veröffentlicht worden und auch online wieder auf dem aktuellen Stand!

Verfasst: Mittwoch 19. Dezember 2007, 19:51
von Leonidas
killercup hat geschrieben:Das Django-Buch ist vor einigen Tagen veröffentlicht worden und auch online wieder auf dem aktuellen Stand!
Oh, Klasse!

Jetzt wird warscheinlich bald Version 1.0 rauskommen (müssen), weil sonst das Papierbuch nicht zu Version 1.0 passen wird. Danach hoffe ich mal auf einige größere Änderungen :)

Verfasst: Mittwoch 19. Dezember 2007, 21:25
von apollo13
Leonidas hat geschrieben:
killercup hat geschrieben:Das Django-Buch ist vor einigen Tagen veröffentlicht worden und auch online wieder auf dem aktuellen Stand!
Oh, Klasse!

Jetzt wird warscheinlich bald Version 1.0 rauskommen (müssen), weil sonst das Papierbuch nicht zu Version 1.0 passen wird. Danach hoffe ich mal auf einige größere Änderungen :)
Freu dich nicht zu früh, ich hoffe dass sie Version 1.0 nicht ohne newforms-admin und qs-refactor rausbringen, aber das wird sicher noch dauern...

Verfasst: Mittwoch 19. Dezember 2007, 21:41
von Leonidas
apollo13 hat geschrieben:Freu dich nicht zu früh, ich hoffe dass sie Version 1.0 nicht ohne newforms-admin und qs-refactor rausbringen, aber das wird sicher noch dauern...
Ich habe die Hoffnung an ``newforms-admin`` ziemlich verloren. Als ich das letzte mal da reingeschaut habe, hat sich da nicht viel getan. :(

Verfasst: Mittwoch 19. Dezember 2007, 22:21
von apollo13
Leonidas hat geschrieben: Ich habe die Hoffnung an ``newforms-admin`` ziemlich verloren. Als ich das letzte mal da reingeschaut habe, hat sich da nicht viel getan. :(
Aber nicht doch :) Ich verwende ihn schon lang, und inzwischen funzen sogar schon die inlines wieder...

Verfasst: Samstag 22. Dezember 2007, 20:01
von klaus
Danke für die Antworten. Letzendlich habe ich die Lösung aber in der aktuellen Version des Djangobooks gefunden. Ich musste nur bei INSTALLED_APPS drei der Auskommentierten Apps entkommentieren.
Allerdings habe ich jetzt ein neues Problem: Wenn ich auf die admin-Startseite gehe kommt ein Fehlerseite.
AttributeError at /admin/
'WSGIRequest' object has no attribute 'user'

Außerdem ist mir gerade aufgefallen, dass jetzt nicht mal mehr der Server geht. Wenn ich im Verzeichnis meines Projekts python manage.py runserver eingebe, kommt der Fehler
ImportError: No module named admindjsite
(mein Projekt heißt djsite)

Hoffe, dass mir jemand helfen kann.

Verfasst: Samstag 22. Dezember 2007, 21:08
von sma
Das kann eigentlich alles gar nicht so schwer sein, ich glaube, du vertippst dich nur irgendwo. Es folgt ein Beispiel. Öffne eine Shell, gehe in ein Verzeichnis, in dem dein neues Projekt landen soll. Prüfe, ob du "python" aufrufen kannst (das "sma$" ist der Prompt meiner Shell und soll nicht mit eingegeben werden!):

Code: Alles auswählen

sma$ python -V
Python 2.5.1
sma$ 
Prüfe, ob du "django-admin.py" aufrufen kannst:

Code: Alles auswählen

sma$ django-admin.py 
Type 'django-admin.py help' for usage.
sma$ 
Falls du "django-admin.py" nicht starten kannst, ist dieser Befehl entweder nicht in dem Suchpfad der Shell oder aber das Django-Rahmenwerk ist nicht richtig installiert und Python kann es nicht finden. Ich benutze übrigens die aktuelle SVN-Version von Django.

Lege jetzt ein Projekt "hello" an:

Code: Alles auswählen

sma$ django-admin.py startproject hello
sma$ 
Es wird ein neues Verzeichnis "hello" angelegt, in dem sich 4 Dateien befinden (das "ls -l" entspricht "dir" unter Windows):

Code: Alles auswählen

sma$ ls -l hello
total 24
-rw-r--r--  1 sma  sma     0 22 Dez 20:40 __init__.py
-rwxr-xr-x  1 sma  sma   546 22 Dez 20:40 manage.py
-rw-r--r--  1 sma  sma  2815 22 Dez 20:40 settings.py
-rw-r--r--  1 sma  sma   223 22 Dez 20:40 urls.py
sma$ 
Gehe in das Verzeichnis "hello" und lege eine neue Anwendung "app" an (unter Windows muss man das "./" weglassen):

Code: Alles auswählen

sma$ cd hello
hello sma$ ./manage.py startapp app
hello sma$ ls -l app
total 16
-rw-r--r--  1 sma  sma   0 22 Dez 20:44 __init__.py
-rw-r--r--  1 sma  sma  57 22 Dez 20:44 models.py
-rw-r--r--  1 sma  sma  26 22 Dez 20:44 views.py
hello sma$ 
Bearbeite "settings.py" und ändere (wir werden sqlite3 benutzen, da ich annehme, du hast Python 2.5.1, wo diese Datenbank mitgeliefert wird):

Code: Alles auswählen

DATABASE_ENGINE = 'sqlite3'    # GEÄNDERT
DATABASE_NAME = 'hello.db'     # GEÄNDERT

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin', # NEU HINZUGEFÜGT
    'hello.app', #NEU HINZUGEFÜGT
)
Bearbeite "urls.py" und ersetze alles durch den folgenden Code:

Code: Alles auswählen

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^admin/', include('django.contrib.admin.urls')),
)
Bearbeite "app/models.py" und lege ein einfaches Modell an:

Code: Alles auswählen

from django.db import models

class Greeting(models.Model):
    text = models.CharField(max_length=100)

    class Admin:
        pass
Lasse Django die Datenbank anlegen:

Code: Alles auswählen

hello sma$ ./manage.py syncdb
Creating table auth_message
Creating table auth_group
Creating table auth_user
Creating table auth_permission
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log
Creating table app_greeting

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): 
Wie du siehst, fragt Django nach einem Superuser, der Admin-Rechte bekommt. Lege den User an, indem du die Fragen beantwortest:

Code: Alles auswählen

Would you like to create one now? (yes/no): yes
Username (Leave blank to use 'sma'): 
E-mail address: sma@example.com
Password: 
Password (again): 
Superuser created successfully.
Installing index for auth.Message model
Installing index for auth.Permission model
Installing index for admin.LogEntry model
hello sma$ 
Starte jetzt den Django-Entwicklungsserver:

Code: Alles auswählen

hello sma$ ./manage.py runserver
Validating models...
0 errors found

Django version 0.97-pre-SVN-6976, using settings 'hello.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Gehe mit dem Browser auf http://localhost:8000/admin/ und melde dich als Superuser mit den eben eingegebenen Daten an. Du solltest eine Liste mit Modellen sehen, insbesondere unser definiertes "Greetings".

Lege ein neues "Greeting" mit dem Text "Hallo, Welt!" an.

Ändere jetzt "urls.py", und füge vor der Zeile mit "admin" folgende Zeile ein:

Code: Alles auswählen

    (r'^$', 'hello.app.views.hello'),
Bearbeite "app/views.py" und ersetze alles durch den folgenden Code:

Code: Alles auswählen

from django.http import HttpResponse
from hello.app.models import Greeting

def hello(request):
    g = Greeting.objects.order_by('?')[0]
    return HttpResponse(g.text)
Gehe mit dem Browser auf http://localhost:8000/ und du solltest "Hallo, Welt!" lesen können.

Wenn du magst, trage weitere Grüße ein. Jedes Mal, wenn du auf die URL zugreifst, wird ein zufälliger Gruß ausgegeben.

Stefan

Verfasst: Sonntag 23. Dezember 2007, 16:10
von klaus
Danke, es hat geklappt. Allerdings weis ich nicht, woran es lag, dass es vorher nicht ging.
Ich habe eig. alles überprüft und keinen einzigen Unterschied zwischen deinem und meinem Projekt gefunde, bis auf das, dass mein Projekt schon mehr Seiten, einige Templates und statisch Inhalt, wie Bilder, enthielt. Auch die Models sind etwas anders, aber das ist ja klar. Ich habe auch die settings-Datei nochmal auf Rechtschreibfehler überprüft und nichts gefunden.
Ich weiß zwar jetzt, dass ich einen Fehler gemacht habe, sonst würde ich bei deinem Projekt auch nicht auf die Admin-Seite kommen, aber ich weiß nicht welchen.
Trotzdem danke für die Hilfe und falls irgendjemand mal herausbekommen sollte, wodurch der von mir oben gepostete Fehler entstehen kann, wäre es nett, wenn er es hier postet.

edit: ich glaube in dem Model muss es maxlength und nicht max_length heißen.

Verfasst: Montag 24. Dezember 2007, 13:38
von jens
klaus hat geschrieben:AttributeError at /admin/
'WSGIRequest' object has no attribute 'user'
Hast du die "AuthenticationMiddleware" nicht an???

Das ist das Problem bei PyLucid und der installation: Wenn man noch kein syncdb gemacht hast, existieren die Tabellen für die Middlewares "SessionMiddleware" und "AuthenticationMiddleware" nicht. Also muß man die erstmal deaktivieren, dann ein syncdb machen und danach wieder aktivieren.

Ist zwar irgendwie doof, aber so funktioniert es ;)