Я создал пользовательскую модель UserModel в Django, и когда я выполняю миграцию, она выдает эту ошибку «AttributeError: объект 'str' не имеет атрибута '_meta'»

Я новичок в django, и я создал CustomUserModel и форму для регистрации пользователя. Но когда я делаю миграцию, это дает мне следующую ошибку:

> File "<frozen importlib._bootstrap>", line 219, in
> _call_with_frames_removed   File "C:\Users\ibm\programs\WebDevelopment\pFolio\pFolio\urls.py", line 19,
> in <module>
>     from users import views as userViews   File "C:\Users\ibm\programs\WebDevelopment\pFolio\users\views.py", line 3,
> in <module>
>     from .forms import UserRegistrationForm, ProfileForm   File "C:\Users\ibm\programs\WebDevelopment\pFolio\users\forms.py", line 9,
> in <module>
>     class UserRegistrationForm(UserCreationForm):   File "C:\Users\ibm\anaconda3\lib\site-packages\django\forms\models.py",
> line 258, in __new__
>     apply_limit_choices_to=False,   File "C:\Users\ibm\anaconda3\lib\site-packages\django\forms\models.py",
> line 142, in fields_for_model
>     opts = model._meta AttributeError: 'str' object has no attribute '_meta

Вот мой различный файл:

models.py Я создал CustomUserModel, унаследованный от AbstractBaseUser и PermissionsMixin, и другую модель профиля, которая имеет связь OneToOne с пользователем и хранит изображение профиля и биографию пользователя. изображение профиля имеет 4 значения по умолчанию в зависимости от их пола.

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.conf import settings
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager

# Create your models here.

class CustomAccountsManager(BaseUserManager):
    def create_user(self, email, user_name, first_name, password, date_of_birth, **other_fields):
        if not email:
            raise ValueError(_('You must provide an E-mail address'))

        other_fields.setdefault('is_activate', True)
        email = self.normalize_email(email)
        user = self.model(email=email, user_name=user_name, first_name=first_name, date_of_birth=date_of_birth, **other_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, user_name, first_name, password, date_of_birth, **other_fields):
        other_fields.setdefault('is_staff', True)
        other_fields.setdefault('is_superuser', True)
        other_fields.setdefault('is_activate', True)
        return self.create_user(self, email, user_name, first_name, password, date_of_birth, **other_fields)

class CustomUserModel(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True)
    user_name = models.CharField(max_length=150, unique=True)
    first_name = models.CharField(max_length=120)
    last_name = models.CharField(max_length=120, blank=True)
    date_of_birth = models.DateField(max_length=8)
    date_created = models.DateTimeField(default=timezone.now) 
    gender = models.CharField(max_length=1, default='N', choices=(('M', 'Male'), ('F', 'Female'), ('T', 'Transgender'), ('N', 'NonBinary')))
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)

    objects = CustomAccountsManager()

    USERNAME_FIELD = 'user_name'
    REQUIRED_FIELDS = ['email', 'first_name', 'date_of_birth']

    def __str__(self):
        return self.user_name

class Profile(models.Model): #IGNORE THIS CLASS
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    img = models.ImageField(blank=True, upload_to='profile_pics')
    bio = models.CharField(max_length=100, blank=True)

    default_pic_mapping = { 'M': 'defM.jpg', 'F': 'defF.jpg', 'N': 'defNB.jpg', 'T': 'defT.jpg'}

    def __str__(self):
        return f'{self.user.username} profile'

    def get_img_url(self):
        if not self.img:
            return settings.MEDIA_URL+(self.default_pic_mapping[self.gender])
        return self.img.url

просмотры.py

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .forms import UserRegistrationForm, ProfileForm
from django.contrib import messages


def register(request):
    if request.method == 'POST':
        form = UserRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.add_message(request, messages.SUCCESS, f'Account created for {username}!')
            return redirect('login')
    else:
        forms = UserRegistrationForm()
    context = {
        'title':    'User Registration',
        'forms':     forms
    }
    return render(request, 'users/register.html', context)

@login_required
def profile(request):
    return render(request, 'users/profile.html')

формы.py

from django import forms
from django.conf import settings
from .models import Profile
from django.contrib.auth.models import User
from django.forms import ModelForm
from django.contrib.auth.forms import UserCreationForm


class UserRegistrationForm(UserCreationForm):
    user_name = forms.CharField(max_length=150)
    email = forms.EmailField()
    first_name = forms.CharField(max_length=120)
    last_name = forms.CharField(max_length=120, required=False)
    date_of_birth = forms.DateField()
    gender = forms.ChoiceField(widget = forms.Select(), choices=(('M', 'Male'), ('F', 'Female'), ('T', 'Transgender'), ('N', 'NonBinary')), initial='N')
    
    class Meta:
        model = settings.AUTH_USER_MODEL
        fields = [
            'user_name',
            'first_name',
            'last_name',
            'email',
            'gender',
            'date_of_birth',
            'password1',
            'password2',
        ]

Спасибо

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

settings.AUTH_USER_MODEL — это str (строка), вместо этого вам нужно иметь объект модели, возможно, User (или пользовательскую модель пользователя, если вы создали ее в своем models.py):

class Meta:
    model = User
    # rest of your code

Другие вопросы по теме