2016-03-27 3 views
1

Ich benutze UpdateView, um Benutzerkonto zu aktualisieren. Benutzer besteht aus User und Userprofile wie folgt aus:Benutzer und UserProfile nicht in einer Ansicht aktualisieren?

class UserProfile(models.Model): 
    user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='userprofile') 
    telephone = models.CharField(max_length=40,null=True) 

Jetzt habe ich eine Klasse erstellt UpdateView der Lage sein, zum Beispiel zu aktualisieren UserProfile - Telefon, das funktioniert.

FORM:

class UserProfileUpdateForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('telephone',) 

URLS:

url(r'^edit-profile$',view=views.UserUpdate.as_view(),name='user_update'), 

VIEW:

# @login_required 
class UserUpdate(UpdateView): 
    form_class = UserProfileUpdateForm 
    context_object_name = 'user_update' 
    template_name = 'auth/profiles/edit-profile.html' 
    success_url = 'success url' 

    def get_object(self,queryset=None): 
     return self.request.user.userprofile 

    def form_valid(self, form): 
     #save cleaned post data 
     clean = form.cleaned_data 
     self.object = form.save() 
     return super(UserUpdate, self).form_valid(form) 

Nun möchte ich einige Attribute ändern können, die auf Benutzer und einige Attribute gehört die gehört zu UserProfile.

Ich habe bereits versucht, UserProfileUpdateForm Felder Variable zu ändern, aber es hat nicht funktioniert ...

class UserProfileUpdateForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('telephone','model.user.first_name',) <- this does not work, I want to add to the form attribute 'first_name' which belongs to User, not UserProfile 

Wissen Sie, was die Lage zu tun, um zu sein Telefon zu ändern, vornamen, nachnamen usw. mit UpdateView?

Antwort

0

Sie müssen auch das zweite Formular für User erstellen. Dann übergeben Sie es als UpdateView als zweites form_class.

Hinweis *: Möglicherweise müssen Sie die Methoden get und post für UpdateView außer Kraft setzen. This SO answer könnte helfen.

beide Formen in einer Vorlage unter einem <form> Tag Render:

<form action="" method="post"> 
    {% csrf_token %} 
    {{ first_form }} 
    {{ second_form }} 
</form> 
2

UpdateView wird nur ein Modell ohne Beziehungen zu handhaben. Die wunderbare Bibliothek django-extra-views bietet CBVs für Modelle und Inline-Beziehungen.

class UserProfileInline(InlineFormSet): 
    model = models.UserProfile 
    form = UserProfileUpdateForm 
    extra = 0 
    def get_factory_kwargs(self): 
     kwargs = super(UserProfileInline,self).get_factory_kwargs() 
     kwargs.update({"min_num": 1}) 
     return kwargs 

class UserCreate(CreateWithInlinesView): 
    model=User 
    inlines = [UserProfileInline] 
    form_class = UserForm 
    success_url = reverse('some-success-url') 
    # REQUIRED - fields or exclude fields of User model 
    template_name = 'your_app/user_profile_update.html' 

Achten Sie darauf, sich auf die Variablen die documentation für Informationen zu überprüfen, um die Vorlage übergeben und wie mit inline formsets zu arbeiten.

Verwandte Themen