2016-03-27 15 views
1

私はUpdateViewを使用してユーザーアカウントを更新します。ユーザーはこのように、ユーザーとのUserProfileで構成されていますユーザーとユーザープロファイルを1つのビューで更新できません。

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

を今、私は例UserProfileのために更新できるようにクラスUpdateViewを作成しました - 働く電話。

FORM:

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

のURL:

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) 

、私は、ユーザーに属し、いくつかの属性といくつかの属性に変更することができるようにしたいですUserProfileに属します。

は、私はすでに変数UserProfileUpdateFormフィールドを変更しようとしましたが、それがすべてでは動作しません...あなたが使用してLAST_NAMEなど、FIRST_NAME、電話を変更することができるように何をすべきか

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 

を知っていますかUpdateView

答えて

0

Userの2番目のフォームも作成する必要があります。その後、同じUpdateViewに2番目のform_classとして渡します。

注:は、getpostの方法を無効にする必要があります。UpdateViewThis SO answerが役に立ちます。

1つの<form>タグの下にひとつのテンプレートで両方のフォームをレンダリングします

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

UpdateViewしかいない関係で一つのモデルを処理するために作られています。しかし、素晴らしいdjango-extra-viewsライブラリは、モデルとインライン関係にCBVを提供します。

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' 

テンプレートとどのようinline formsetsで動作するように渡された変数については、documentationをチェックアウトしてください。

関連する問題