Django - редактирование пользовательских полей профиля пользователя в двух разных формах - PullRequest
0 голосов
/ 25 апреля 2018

У меня очень сильная головная боль.Я искал информацию в течение всей недели, и все же я все еще застрял.

Я хочу создать две подстраницы с двумя разными формами, которые связаны с одной и той же моделью пользователя: / account / register.html - я уже использую стандартную пользовательскую форму Django / account / questionnaire.html - страница для ОБНОВЛЕНИЯ дополнительной информации, такой как город пользователя, веб-сайт, телефон и т. д.

Форма регистрацииза работой.У меня проблема со вторым.Вывод на консоль при отправке второй формы: [25/Apr/2018 17:29:11] "POST /accounts/edituserinfo/ HTTP/1.1" 302 0 [25/Apr/2018 17:29:11] "GET /accounts/profile/ HTTP/1.1" 200 1818 302 означает перенаправление, я думаю ...

models.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete='CASCADE')
    description = models.CharField(max_length=100, default='')
    city = models.CharField(max_length=100, default='')
    website = models.URLField(default='')
    phone = models.IntegerField(default=0)
    def __str__(self):
        return self.user.username

def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])

post_save.connect(create_profile, sender=User)

forms.py

from django import forms
from accounts.models import UserProfile
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, UserChangeForm

class RegistrationForm(UserCreationForm):
    email = forms.EmailField(required=True)
    field_order = ['username', 'email', 'password1','password2',
        'first_name','last_name']

    class Meta():
        model = User
        fields = {
            'username',
            'first_name',
            'last_name',
            'email',
            'password1',
            'password2',
        }

    def save(self,commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.first_name = self.cleaned_data['first_name']
        user.first_name = self.cleaned_data['last_name']
        user.first_name = self.cleaned_data['email']

        if commit:
            user.save()
        return user

class EditProfileForm(UserChangeForm):

    class Meta():
        model = User
        fields = {
            'email',
            'first_name',
            'last_name',
            'password',
        }

class EditUserInfo(forms.ModelForm):

    class Meta():
        model = UserProfile
        fields = {
            'description',
            'city',
            'website',
            'phone',
        }

views.py

from django.shortcuts import render, reverse, redirect, HttpResponse
from accounts.forms import RegistrationForm, EditProfileForm, EditUserInfo
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserChangeForm, PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.decorators import login_required

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect(reverse('accounts:home'))
    else:
        form = RegistrationForm()

    args = {'form': form}
    return render(request, 'accounts/register.html', args)

def edit_user_info(request):
    if request.method == 'POST':
        form = EditUserInfo(data=request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect(reverse('accounts:view_profile'))
    else:
        form = EditUserInfo(instance=request.user)
    args = {'form':form}
    return render(request, 'accounts/edit_user_info.html', args)

register.html

{% extends 'base.html' %}

{% block head %}
  <title>Register.html</title>
{% endblock %}


{% block body %}
  <div class="container">
    <h1>Register</h1>
    <form method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <button class="btn btn-primary" type="submit">Register</button>
    </form>
  </div>
{% endblock %}

edit_user_info.html

{% extends 'base.html' %}

{% block head %}
  <title>Edit_user_info.html</title>
{% endblock %}


{% block body %}
  <div class="container">
    <h1>Edit user info</h1>
    <form method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <button class="btn btn-primary" type="submit">Edit User Info</button>
    </form>
  </div>
{% endblock %}

1 Ответ

0 голосов
/ 25 апреля 2018

Форма EditUserInfo предназначена для модели UserProfile.Поэтому вы должны создать его экземпляр с UserProfile экземпляром, а не request.user (User экземпляром).

from django.contrib.auth.decorators import login_required

@login_required
def edit_user_info(request):
    if request.method == 'POST':
        form = EditUserInfo(data=request.POST, instance=request.user.userprofile)
        ...
    else:
        form = EditUserInfo(instance=request.user.userprofile)
    ...

Обратите внимание, что я добавил декоратор login_required, так что тольков пользователи могут получить доступ к представлению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...