Django передать запрос .POST и request.FILES в форме редактирования профиля - PullRequest
1 голос
/ 03 ноября 2010

У меня есть представление, которое позволяет пользователям редактировать свои профили (обычное имя, имя пользователя и т. Д.) И изображение, содержащееся в Ì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))

, и форма:

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)

и другие варианты без успеха.

Ответы [ 3 ]

3 голосов
/ 03 ноября 2010

Когда вы переопределяете конструктор формы, рекомендуется передавать именованные аргументы, а не только по порядку. Итак, я бы сделал:

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

Таким образом, кому-то, читающему код, становится ясно, что у вас есть нестандартная форма, которая ожидает пользовательский аргумент, и она явно указывает, какие аргументы вы передаете.

В качестве альтернативы, если вы настаиваете на вызове конструктора без указания аргументов, правильный способ сделать это:

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

, поскольку user является первым аргументом вашего конструктора.

0 голосов
/ 27 января 2011

Самый безопасный способ переопределить __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)

и т.д.

0 голосов
/ 03 ноября 2010

Попробуйте

edit_form = EditProfileForm(request.POST, request.FILES, user = user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...