Django 以 editprofile 形式传递 request.POST 和 request.FILES

Mer*_*moz 3 django request django-forms

我有一个观点,使用户可以编辑自己的个人资料(常用名,用户名等),并包含在一个图像ÌmageField中的UserProfile

@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))
Run Code Online (Sandbox Code Playgroud)

形式是:

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
Run Code Online (Sandbox Code Playgroud)

问题是我需要将“request.FILES”传递给表单!我试过了

edit_form = EditProfileForm(data = request.POST, request.FILES, user = user)
Run Code Online (Sandbox Code Playgroud)

和其他没有成功的变体。

rz.*_*rz. 5

当您覆盖表单的构造函数时,传递命名的参数而不是按顺序传递是个好主意。所以,我会这样做:

edit_form = EditProfileForm(user=user, data=request.POST, files=request.FILES)
Run Code Online (Sandbox Code Playgroud)

这样,阅读代码的人就很清楚您有一个需要用户参数的非标准形式,并且它明确了您传递的参数。

或者,如果您坚持在不命名参数的情况下调用构造函数,则正确的方法是:

edit_form = EditProfileForm(user, request.POST, request.FILES)
Run Code Online (Sandbox Code Playgroud)

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