Seite 1 von 1

django: ModelForm vom django 'User' model.

Verfasst: Mittwoch 10. September 2008, 09:58
von jens
Seit neustem hab ich damit Probleme:

Code: Alles auswählen

from django.contrib.auth.models import User
class UsernameForm(forms.ModelForm):
    class Meta:
        model = User
        fields=("username",)
Wenn das Formular abgeschickt wird, gibt es immer nur ein Form-Error:
User with this Username already exists.
Weiß jemand warum?

Verfasst: Donnerstag 11. September 2008, 08:37
von jens
Bin nur ein kleines Stück weiter. Es hat was zu tun mit der Änderung: http://code.djangoproject.com/changeset/8805
Mit django.models.BaseModelForm.validate_unique() dort wird der Fehler erzeugt.

Hab mal eine locale Test App gebaut:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os

os.chdir("../pylucid_project/") # Goto where django exist, optional

APP_LABEL = os.path.splitext(os.path.basename(__file__))[0]

os.environ["DJANGO_SETTINGS_MODULE"] = "django.conf.global_settings"
from django.conf import global_settings

global_settings.INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    APP_LABEL,
)
global_settings.DATABASE_ENGINE = "sqlite3"
global_settings.DATABASE_NAME = ":memory:"

#______________________________________________________________________________
# Test app code:

from django import forms
from django.contrib.auth.models import User
class UsernameForm(forms.ModelForm):
    class Meta:
        model = User
        fields=("username",)

#------------------------------------------------------------------------------
if __name__ == "__main__":
    print "- create the model tables...",
    from django.core import management
    management.call_command('syncdb', verbosity=1, interactive=False)
    print "OK"

    #__________________________________________________________________________
    # Test code:
     
    User.objects.create_superuser(username="test", email="", password="test")
    
    f = UsernameForm({u'username': u'test'})
    print f.is_valid()
    print f.errors
    
    print "- END -"
Ausgabe (Auf's wesentliche gekürzt):
...
False
...User with this Username already exists...
...
Es ist also so, das es normal ist?

EDIT: Code korrigiert.

Verfasst: Donnerstag 11. September 2008, 08:56
von jens
So. Also ich denke ich hab das Problem gefunden: ModelForms sind dazu da, die POST Daten auch wirklich in das entsprechende Datenbankmodel einzufügen.
In meinem Fall möchte ich aber ModelForms nur dazu nutzten, die Form zu generieren und die Daten zu validieren: z.B. Ist der eingegebene Username ok? Ich möchte aber nicht den User anlegen. Somit braucht validate_unique() nicht ausgeführt werden. Ich sehe im django code aber keine Möglichkeit das auszuschalten.

Übersehe ich da etwas?

EDIT: gerade eine Idee, siehe:

Code: Alles auswählen

class UsernameForm(forms.ModelForm):

    def validate_unique(self):
        """ nicht unique testen """
        pass

    class Meta:
        model = User
        fields=("username",)
Damit wird das Prüfen komplett "übersprungen"...

EDIT: Siehe auch http://www.jensdiemer.de/_command/118/blog/detail/30/

Verfasst: Samstag 16. Januar 2010, 21:36
von jens
Schade... validate_unique() überschreiben hilft mit dem aktuellen django trunk nicht mehr :(

Jemand eine Idee?

Verfasst: Sonntag 17. Januar 2010, 11:32
von sma
jens hat geschrieben:Jemand eine Idee?
Eine normale Form selbst bauen?

Stefan

Verfasst: Sonntag 17. Januar 2010, 12:27
von apollo13
+1, ein ModelForm für ein Feld, wo man nur den Username eingeben kann und nichtmal den validieren will ist sinnfrei…

Verfasst: Sonntag 17. Januar 2010, 12:33
von jens
Das ganze ist für einen eigenen Login view. Ich brauche mal den Usernamen, mal das password und mal die email Adresse.

Und natürlich sollte die Form validiert werden. z.B. die Länge der Eingabe. Eine ModelForm bietet sich da an, weil man dann automatisch die Sachen vom bestehenden Model übernimmt.

Aber wahrscheinlich ist es wirklich einfacher eine normale Form selber zu erstellen. Aber richtig DRY ist das nicht...

Verfasst: Sonntag 17. Januar 2010, 15:17
von apollo13
Nunja es ist weiterhin DRY; du brauchst nur die Modelvalidation für das Feld username deaktivieren (Die nun eben im Model selbst gemacht wird, aber vom Form aus deaktiviert werden kann…).

Verfasst: Sonntag 17. Januar 2010, 17:01
von jens
Äh?

Also wenn ich eine eigene Form erstelle, dann habe ich keine Verbindung zum Model.

Wenn ich eine ModelForm erstelle, dann schon. Aber wie deaktiviere ich die model validation da?

Verfasst: Sonntag 17. Januar 2010, 17:04
von apollo13
jens hat geschrieben:Wenn ich eine ModelForm erstelle, dann schon. Aber wie deaktiviere ich die model validation da?
Use the source luke! Sollte nach anschauen von ModelForm.clean eigentlich glasklar sein… Allerdings musst du probieren, ob die max_length dann nicht auch gleich übersprungen wird…