2016-03-22 12 views
1

Meine Django-Site hat zwei Arten von Benutzerprofilen, eines für normale Benutzer (MyUserProfile) und eines, das es erweitert, für Mitarbeiter (EmployeeUserProfile). models.py:Speichern des Profilmodells nach dem Update: IntegrityError (doppelter Schlüssel user_id)

class MyUserProfile(models.Model): 
    user = models.OneToOneField('auth.user', related_name='userprofile') 
    www = models.URLField(null=True, blank=True, verbose_name='website') 
    affiliation = models.CharField(max_length=200,null=True,blank=True) 
    ... 

class EmployeeUserProfile(MyUserProfile): 
    start_date = models.DateField() 
    current = models.BooleanField(default=True) 
    ... 

Ich habe ein Problem ein Profil Update-Formular für die Mitarbeiter zu implementieren. Ich schaffe das Formular so (forms.py):

from django.forms import ModelForm 
from .models import EmployeeUserProfile 

class EmployeeUserProfileForm(ModelForm): 
    class Meta: 
     model = EmployeeUserProfile 
     exclude = ['user', 'current'] 

Aber wenn ich komme, um das Profil zu aktualisieren:

from django.template import RequestContext 
from .forms import EmployeeUserProfileForm 

def update_profile(request): 
    if request.method == 'POST': 
     form = EmployeeUserProfileForm(request.POST) 
     if form.is_valid(): 
      profile = form.save(commit=False) 
      profile.user = request.user 
      profile.save() 
    else: 
     user = request.user 
     profile = user.userprofile.employeeuserprofile 
     form = EmployeeUserProfileForm(instance=profile) 
    c = {'form': form} 
    return render_to_response('pages/profile/update.html', c, 
           context_instance=RequestContext(request)) 

auf ‚Senden‘ für die Aktualisierung eines bereits erstellten Profil ich ein IntegrityError bekommen. Zum Beispiel (1062, "Duplicate entry '2' for key 'user_id'"). Anscheinend versucht Django, eine Kopie des Benutzers hinzuzufügen, anstatt die vorhandene zu aktualisieren.

Was mache ich falsch?

Antwort

5

Sie müssen auch die Instanz Argument in der POST Zustand passieren

form = EmployeeUserProfileForm(request.POST) 

form = EmployeeUserProfileForm(request.POST, instance=profile) 

By not sending the instance argument, form tries to create instead of update sein sollte. Beachten Sie, dass dies bedeuten würde, Sie else Block über if

So etwas bewegen müsste:

@login_required 
def update_profile(request): 

    user = request.user 
    profile = user.userprofile.employeeuserprofile 
    form = EmployeeUserProfileForm(instance=profile) 

    if request.method == 'POST': 
     form = EmployeeUserProfileForm(request.POST, instance=profile) 
     if form.is_valid(): 
      profile = form.save(commit=False) 
      profile.user = request.user 
      profile.save() 

    c = {'form': form} 
    return render_to_response('pages/profile/update.html', c, 
           context_instance=RequestContext(request)) 

Sie auch die login_required Dekorateur verwenden möchten, so dass Sie in Probleme mit anonymer Benutzer laufen nicht, usw.

+0

Doh! Ich fühle mich jetzt dumm. Danke - das war falsch. (Ich habe 'login_required'). – xnx

+0

Froh, dass es geholfen hat .. Alles ein Teil der Lernerfahrung :) – karthikr

Verwandte Themen