2010-11-02 46 views
1

我有一个观点,使用户能够编辑他们的个人资料(常用名称,用户名等等)和UserProfile内包含在ÌmageField一个图像:Django的传递request.POST和request.FILES在editprofile形式

@login_required 
def editprofile(request): 
     user = request.user 
     if request.method == 'POST': 
       edit_form = EditProfileForm(data = request.POST, user = user) 
       if edit_form.is_valid(): 
         user = edit_form.save() 
         request.user.message_set.create(message='Votre profil a été modifié.') 
         return HttpResponseRedirect('/') 
     else: 
       dict = {'first_name':user.first_name, 'last_name':user.last_name, 'email':user.email, 'username':user.username} 
       edit_form = EditProfileForm(user = user, data = dict) 
     tpl_dict = {'form' : edit_form} 
     return render_to_response('editprofile.html', tpl_dict, RequestContext(request)) 

和形式是:

class EditProfileForm(forms.Form): 
    first_name = forms.CharField(max_length = 100, required=False) 
    last_name = forms.CharField(max_length = 100, required=False) 
    email = forms.EmailField() 
    username = forms.CharField(max_length = 100) 
    avatar = forms.ImageField(required = False) 

    def __init__(self, user, *args, **kwargs): 
     super(EditProfileForm, self).__init__(*args, **kwargs) 
     self.user = user 

    def save(self): 
     user = self.user 
     user.email = self.cleaned_data['email'] 
     user.username = self.cleaned_data['username'] 
     user.first_name = self.cleaned_data['first_name'] 
     user.last_name = self.cleaned_data['last_name'] 
     user.save() 
     profile = user.get_profile() 
     profile.avatar = self.cleaned_data['avatar'] 
     profile.save() 
     return user 

的问题是,我需要传递`request.FILES”的形式! 我试了

edit_form = EditProfileForm(data = request.POST, request.FILES, user = user) 

和其他变种没有成功。

回答

2

当你将覆盖窗体的构造是通过命名,而不是参数只是为了一个好主意。所以,我会做:

edit_form = EditProfileForm(user=user, data=request.POST, files=request.FILES) 

这样,它很清楚,有人读书,你有一个期望用户参数非标准格式的代码,它使你逝去明确哪些参数。

另外,如果你在调用构造函数不点名的观点坚持,这样做正确的做法是:

edit_form = EditProfileForm(user, request.POST, request.FILES) 

因为user是第一个参数构造函数。

0

尝试

edit_form = EditProfileForm(request.POST, request.FILES, user = user) 
+0

这将等同于'EditProfileForm(用户= request.POST,文件= request.FILES,用户=用户)' - 引发异常(多收到“用户”的价值)。 – eternicode 2011-01-27 19:34:20

0

覆盖窗体的__init__最安全的办法就是多听额外kwargs:

class EditProfileForm(forms.Form): 
    # [fields] 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user', default_user) # fetch `user` and remove from kwargs 
     super(EditProfileForm, self).__init__(*args, **kwargs) 
     self.user = user 

这使得形式的原始签名基本上是不变的,你可以实例化它作为正常的,用你的额外的参数上上涨端:

EditProfileForm(request.POST, user=user) 
EditProfileForm(request.POST, request.FILES, user=user)