Как обновить django auth User с помощью пользовательской формы - PullRequest
0 голосов
/ 05 июля 2018

Я использую встроенную аутентификацию Django для управления пользователями на веб-сайте социальных сетей. Я использую отношение один-к-одному, чтобы прикрепить профиль к каждому пользователю. Я могу обновить все части профиля, который я прикрепил, используя UpdateView. Однако я не знаю, как это сделать с помощью встроенного в Django пользователя. Поэтому я создал форму, которая использует класс _meta. Я дошел до того, что моя форма будет добавлять нового пользователя вместо обновления текущего. Я надеялся, что один из вас сможет помочь мне исправить мой код. Заранее благодарим за любую помощь, которую вы можете предложить

views.py

class PrivProfileUpdate(View):
form_class = UserUpdateForm
template_name = 'user/user_form.html'

#display a blank form
def get(self, request, pk):
    form = self.form_class(None)
    return render(request, self.template_name, {'form': form})

#proces form data
def post(self, request, pk):
    form = self.form_class(request.POST)
    user = User.objects.get(pk=pk)
    if form.is_valid():

        user = form.save(commit=True)

        print("we are trying to save")
        #cleaned (normalized) data
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        first_name = form.cleaned_data['first_name']
        last_name = form.cleaned_data['last_name']
        email = form.cleaned_data['email']
        user.set_password(password) #this is the only way to change a password because of hashing
        user.save()

    return render(request, self.template_name,{'form': form})

forms.py

class UserUpdateForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput)

class Meta:
    model = User
    fields = ['username', 'email', 'password', 'first_name', 'last_name']

РЕШЕНИЕ:

в views.py

class PrivProfileUpdate(UpdateView):
model = User
form_class = UserUpdateForm
template_name = 'user/user_form.html'

def form_valid(self, form):
    user = form.save(commit=True)
    password = form.cleaned_data['password']
    user.set_password(password)
    user.save()
    return redirect('user:index')

1 Ответ

0 голосов
/ 05 июля 2018

Здесь нет ничего особенного в классе User. Как и для любой другой модели, для обновления существующего экземпляра вы передаете его в качестве аргумента instance в форму.

Однако на самом деле вам вообще не нужно это делать. Вы должны использовать UpdateView, который делает это для вас; тогда вам не нужно определять get и post. Единственный метод, который вам нужно определить здесь - это form_valid, чтобы установить пароль:

class PrivProfileUpdate(UpdateView):
    form_class = UserUpdateForm
    template_name = 'user/user_form.html'

    def form_valid(self, form):
        user = form.save(commit=True)
        password = form.cleaned_data['password']
        user.set_password(password)
        user.save()
        return HttpResponseRedirect(self.get_success_url())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...