Django Form not Saving Поле, которое я добавил

Я следую учебнику Django на Youtube, я добавил поле био в UserUpdateForm. В change_profile.html есть слот для редактирования биографии, но когда я нажимаю кнопку обновления, обновляется все остальное, кроме биографии.

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import Profile

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()
    # What I added
    bio = forms.CharField(required=False)

    class Meta:
        model = User
        fields = ['username', 'email', 'bio']

class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['image']

Функция, сохраняющая формы

@login_required
def change_profile(request):
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request, 'Profile Updated')
            return redirect('profile')
    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)
    context = {
        'u_form' : u_form,
        'p_form' : p_form
    }
    return render(request, 'users/change_profile.html', context)

Изменение_профиля.html

{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block title %}Change Profile{% endblock title %}
{% block content %}
    <div class="content-section">
        <form method="post" enctype="multipart/form-data">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Edit Profile</legend>
                {{ u_form|crispy }}
                {{ p_form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Update</button>
            </div>
        </form>
    </div>
{% endblock content %}

И профиль.html

{% extends "blog/base.html" %}
{% block title %}Profile{% endblock title %}
{% block content %}
    <div class="content-section">
        <div class="media">
            <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
            <div class="media-body">
                <h2 class="account-heading">{{ user.username }}</h2>
                <p class="text-secondary">{{ user.email }}</p>
                <p class="article-content">{{ user.bio }}</p>
            </div>
        </div>
        <a class="ml-2" href="{% url 'change_profile' %}">Edit Profile</a>
{% endblock content %}

Вы могли бы просто переопределить модель User и добавить свои пользовательские поля, тогда вам не нужно будет добавлять дополнительные поля в форму. Посмотрите этот пример:

from django.contrib.auth.models import User


class UserProfile(models.Model):

    user = models.OneToOneField(User)
    bio = models.TextField()

    def __str__(self):
        return unicode(self.user)

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

AUTH_USER_MODEL ='your_app.UserProfile'

Потому что в модели User по умолчанию нет атрибута bio, поэтому негде хранить значение, которое вы получаете из формы. Сначала вам нужно добавить его в модель. Вы можете создать пользовательскую модель пользователя, но поскольку у вас уже есть модель Profile, вы можете хранить bio вместе с image:

class Profile(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   image = models.ImageField()
   bio = models.CharField(max_length=225, blank=True, null=True)

И в файле forms.py добавьте новое поле в список полей:

class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('image', 'bio')
Вернуться на верх