Некоторые данные форм 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.