Zusätzliche Information im Gjango User model unter bringen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

Hi,
ich habe nach folgenden Anleitungen, welche eigentlich das selbe beschreiben, versucht einem User zusätzliche Felder zu geben, so das ich mehr Infos zum einzelnen User speichern kann.

http://www.djangoproject.com/documentat ... bout-users
http://www.b-list.org/weblog/2006/jun/0 ... ser-model/

Mein Code sieht jetzt so aus:
models.py

Code: Alles auswählen

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
	matrikelnr = models.IntegerField()
	ip = models.CharField(max_length=15)
	mac = models.CharField(max_length=17)
	user = models.ForeignKey(User, unique=True)
views.py

Code: Alles auswählen

def registrieren(request):
    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        if form.is_valid():
            ip = request.META.get('REMOTE_ADDR')
            formdata = form.cleaned_data
            username = formdata["username"]
            firstname = formdata["firstname"]
            lastname = formdata["lastname"]
            matrikelnr = formdata["matrikelnr"]
            password = formdata["password"]
            email = "platzhalter@platzhalter.de"
            try:
                user = User.objects.get(username = username)
                #eigentlich eine neue Seite
                return HttpResponse("Kann den Nutzer nicht anlegen, da er schon existiert")
            except:
                # Erstelle den user
                user = User.objects.create_user(username, email)
                # Setze die Standart Felder
                user.set_password(password)
                user.first_name = firstname
                user.last_name = lastname
                # Setze die Profil Felder
                p = user.get_profile() ### <--------
                p.ip = ip ### <--------
                # Lege den Nutzer an
                user.save()
                #und sende vielleicht noch eine Mail
                
            return http.HttpResponse("User angelegt")  
Als fehler bekomme ich "UserProfile matching query does not exist" "Exception Location: /usr/lib/python2.5/site-packages/django/db/models/query.py in get, line 197"
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Du musst das User Profile das erste mal selbst anlegen und mit dem User verbinden. Vlt. wirds ja mal gepatcht: http://code.djangoproject.com/ticket/7584

MfG apollo13
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

und dein nacktes "except" macht sich da sicher gut...
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

Könntet ihr mir bitte ein Code Beispiel geben wie ich ein User Profil anlege und es verbinde?
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Laines hat geschrieben:Könntet ihr mir bitte ein Code Beispiel geben wie ich ein User Profil anlege und es verbinde?
/me ist heute zu gut drauf:

Code: Alles auswählen

x = YourUserProfile()
x.user = request.user
x.save()
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

Ich habs jetzt so geändert:

Code: Alles auswählen

def registrieren(request):
    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        if form.is_valid():
            ip = request.META.get('REMOTE_ADDR')
            formdata = form.cleaned_data
            username = formdata["username"]
            firstname = formdata["firstname"]
            lastname = formdata["lastname"]
            matrikelnr = formdata["matrikelnr"]
            password = formdata["password"]
            email = "platzhalter@platzhalter.de"
            try:
                user = User.objects.get(username = username)
                #eigentlich eine neue Seite
                return HttpResponse("Kann den Nutzer nicht anlegen, da er schon existiert")
            except:
                # Erstelle den user und Verbinde das Profil
                user = User.objects.create_user(username, email)
                x = models.UserProfile()
		        x.user = request.user
		        x.ip = ip
		        x.matrikelnr = matrikelnr
		        x.save()
                # Setze die Standart Felder
                user.set_password(password)
                user.first_name = firstname
                user.last_name = lastname
                user.save()
                
            return http.HttpResponse("User angelegt")  
            #return HttpResponseRedirect('fileupload.html')
        else:
            return http.HttpResponse("Fehler bei der Eingabe")
    else:
        form = CreateUserForm()
        return render_to_response("registrierung.html", {'form': form})
Beim ersten mal wenn ich einen User anlege Funktioniert alles und er hat sein Profil mit den zusätzlichen Infos. Wenn sich allerdings ein zweiter Nutzer anlegen will, kommt "column user_id is not unique"
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Code: Alles auswählen

x.user = request.user 
Kann natürlich nur einmal funktionieren, außer du meldest dich mit verschiedenen Usern an, du solltest ``user`` weiterverwenden (den aus user = User.objects.create_user(username, email)). Da du dort immer einen neuen erstellst -> somit unique id

Und du solltest den User auch speichern, bevor du sein Profil speicherst...
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

Hi apollo,
ich bin hier die ganze Zeit am Rumprobieren... Könntest du mir den Kurzen Code abschnitt mal Posten.
Antworten