Некоторые данные форм Django не отображаются в базе данных MongoDB?

Я столкнулся с проблемой в моем Django приложении, где я расширил встроенную модель User дополнительными полями, такими как company_name и role, но когда я пытаюсь зарегистрировать нового пользователя через форму регистрации, эти дополнительные поля не сохраняются в базе данных MongoDB, но другие поля видны. Когда я отправляю форму регистрации, пользователь успешно создается и сохраняется в базе данных, но поля company_name и role не заполняются. Однако я добавил в свое представление операторы печати для проверки данных формы непосредственно перед сохранением, и я вижу, что дополнительные поля заполняются правильно.

[forms.py]

from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth.models import User
from django import forms
from django.forms.widgets import PasswordInput, TextInput
from django.core.exceptions import ValidationError

class CreateUserForm(UserCreationForm):
    company_name = forms.CharField(max_length=100)
    role = forms.CharField(max_length=100)
    email = forms.EmailField(required=True)

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if email and email.endswith('@gmail.com'):
            raise ValidationError("Gmail addresses are not allowed.")
        return email

    class Meta:

        model = User
        fields = ['username', 'email','company_name', 'role', 'password1', 'password2']
    
    def save(self, commit=True):
        user = super(CreateUserForm, self).save(commit=False)
        user.company_name = self.cleaned_data['company_name']
        user.role = self.cleaned_data['role']
        if commit:
            user.save()
        return user

class LoginForm(AuthenticationForm):

    username = forms.CharField(widget=TextInput())
    password = forms.CharField(widget=PasswordInput())

[views.py]

from django.shortcuts import render, redirect
from . forms import CreateUserForm, LoginForm
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import auth
from django.contrib.auth import authenticate, login, logout



def homepage(request):

    return render(request, 'loginapp/index.html')

def signupPage(request):
     form = CreateUserForm()

     if request.method == "POST":

        form = CreateUserForm(request.POST)

        if form.is_valid():
            print("Form data:", form.cleaned_data)
            form.save()

            return redirect("loginPage")


     context = {'registerform':form}

     return render(request, 'loginapp/signupPage.html', context=context)


def loginPage(request):
    form = LoginForm()

    if request.method == 'POST':

        form = LoginForm(request, data=request.POST)

        if form.is_valid():

            username = request.POST.get('username')
            password = request.POST.get('password')

            user = authenticate(request, username=username, password=password)

            if user is not None:

                auth.login(request, user)

                return redirect("dashboard")


    context = {'loginform':form}

    return render(request, 'loginapp/loginPage.html', context=context)

def user_logout(request):
    auth.logout(request)

    return redirect("")


@login_required(login_url="loginPage")
def dashboard(request):
    return render(request, 'loginapp/dashboard.html')

Я проверил свою базу данных MongoDB, и поля company_name и role не присутствуют в сохраненных документах пользователей. Таким образом, похоже, что проблема кроется в процессе сохранения. Не мог бы кто-нибудь помочь мне понять, почему дополнительные поля не сохраняются в базе данных MongoDB и как я могу решить эту проблему? Спасибо!

Вы не расширяли пользовательскую модель, ваша форма использует ту же самую пользовательскую модель. Вы только добавили дополнительные поля в форму.

Для MongoDb динамическое добавление дополнительных полей не представляло бы особой проблемы. Но идея Django состоит в том, чтобы перечислить поля, поскольку они влияют на поля формы, админку и более или менее "экосистему" Django.

Таким образом, вы должны не только настроить формы, но и определить пользовательскую модель [Django-doc] в первую очередь. Это будет выглядеть так:

# app_name/models.py

from django.contrib.auth.models import AbstractUser
from django.core.exceptions import ValidationError
from django.utils.translation import gettext as _


def validate_email(email):
    if email.endswith('@gmail.com'):
        raise ValidationError('@gmail is not allowed')


class User(AbstractUser):
    company_name = models.CharField(max_length=100)
    role = models.CharField(max_length=100)
    email = models.EmailField(
        _('email address'), blank=False, validators=[validate_email]
    )

и затем установите AUTH_USER_MODEL настройки [Django-doc] на:

# settings.py

AUTH_USER_MODEL = 'app_name.User'

Выполняя миграции, вы создадите соответствующий документ в базе данных MongoDb, а затем мы можем позволить форме работать с ним с помощью:

from app_name.models import User


class CreateUserForm(UserCreationForm):
    class Meta:
        model = User
        fields = [
            'username',
            'email',
            'company_name',
            'role',
        ]

and that is essentially it. I would however read the section on Using a custom user model [Django-doc] and the next sections to add for example the corresponding ModelAdmin to make working with a custom user model more convenient.

Вернуться на верх