5

Mam dwa modele w Django: User (wstępnie zdefiniowany przez Django) i UserProfile. Te dwa są połączone za pomocą klucza obcego.Tworzenie widoku, który zapisuje obiekty User i UserProfile w Django

models.py:

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True, related_name="connect") 
    location = models.CharField(max_length=20, blank=True, null=True) 

Używam UserCreationForm (pre-definiowane przez Django) do modelu użytkownika i stworzył inną formę dla UserProfile w forms.py

#UserCreationForm for User Model 

class UserProfileForm(ModelForm): 
    class Meta: 
    model = UserProfile 
    exclude = ("user",) 

I załaduj obie te formy do szablonu, registration.html, aby klient serwisu mógł wprowadzić dane o polach zawartych w obu modelach (np. "first_name", "last_name" w modelu użytkownika, "location" w modelu UserProfile).

Dla mojego życia nie mogę wymyślić, jak utworzyć widok dla tego formularza rejestracyjnego. To, co do tej pory próbowałem, utworzy obiekt User, ale nie będzie kojarzyć innych informacji, takich jak lokalizacja w odpowiednim obiekcie UserProfile. Czy ktoś może mi pomóc? To, co obecnie mam:

def register(request): 
    if request.method == 'POST': 
    form1 = UserCreationForm(request.POST) 
    form2 = UserProfileForm(request.POST) 
    if form1.is_valid(): 
     #create initial entry for User object 
     username = form1.cleaned_data["username"] 
     password = form1.cleaned_data["password"] 
     new_user = User.objects.create_user(username, password) 

     # What to do here to save "location" field in a UserProfile 
     # object that corresponds with the new_user User object that 
     # we just created in the previous lines 

    else: 
    form1 = UserCreationForm() 
    form2 = UserProfileForm() 
    c = { 
    'form1':UserCreationForm, 
    'form2':form2, 
    } 
    c.update(csrf(request)) 
    return render_to_response("registration/register.html", c) 
+0

http://stackoverflow.com/questions/569468/django-multiple-models-in-one-template-using-forms –

Odpowiedz

3

prawie tam :)

def register(request): 
    if request.method == 'POST': 
     form1 = UserCreationForm(request.POST) 
     form2 = UserProfileForm(request.POST) 
     if form1.is_valid() and form2.is_valid(): 
      user = form1.save() # save user to db 
      userprofile = form2.save(commit=False) # create profile but don't save to db 
      userprofile.user = user 
      userprofile.location = get_the_location_somehow() 
      userprofile.save() # save profile to db 

    else: 
     form1 = UserCreationForm() 
     form2 = UserProfileForm() 
    c = { 
     'form1':form1, 
     'form2':form2, 
    } 
    c.update(csrf(request)) 
    return render_to_response("registration/register.html", c) 

Aby wyjaśnić nieco, form.save() tworzy instancję modelu i zapisuje go w DB. form.save(commit=False) Po prostu tworzy instancję, ale nie zapisuje niczego w db.

Powiązane problemy