Менеджер не доступен; Пользователь был подкачан для 'домашнего животного. Человек'

Я с помощью пользовательской модели по умолчанию в django для вполне немного, и я понимаю, если бы я должен далее улучшить его, я должен был бы создать свою собственную Пользовательскую Модель в django 1.5.

Я создал свою пользовательскую пользовательскую модель, и у меня есть функция, которая позволяет пользователям регистрироваться. Я думаю, что моя пользовательская пользовательская модель является несовместимой с моей функцией, потому что она не позволила бы мне делать request.user. Как я могу зафиксировать это так, я могу использовать request.user снова?

представления

 def LoginRequest(request):
         form = LoginForm(request.POST or None)    
    if request.user.is_authenticated():
             username = User.objects.get(username=request.user)
             url = reverse('world:Profile', kwargs = {'slug': person.slug})
             return HttpResponseRedirect(url)       
         if request.POST and form.is_valid():

             user = form.authenticate_user()
             login(request, user)
            username= User.objects.get(username=request.user)
                person = Person.objects.get(user=request.user)
            url = reverse('world:Profile', kwargs = {'slug': person.slug})
             return HttpResponseRedirect(url)

    return render(request, 'login.html',{'form': form})

модели

 class PersonManager(BaseUserManager):
     def create_user(self, email,date_of_birth, username,password=None,):
         if not email:
             msg = 'Users must have an email address'
             raise ValueError(msg)

         if not username:
              msg = 'This username is not valid'
        raise ValueError(msg)

         if not date_of_birth:
             msg = 'Please Verify Your DOB'
             raise ValueError(msg)

         user = self.model(

 email=PersonManager.normalize_email(email),username=username,date_of_birth=date_of_birth)

         user.set_password(password)
         user.save(using=self._db)
         return user

     def create_superuser(self,email,username,password,date_of_birth):
         user = self.create_user(email,password=password,username=username,date_of_birth=date_of_birth)
         user.is_admin = True
         user.is_staff = True
         user.is_superuser = True
         user.save(using=self._db)
         return user


 class Person(AbstractBaseUser, PermissionsMixin):

     email = models.EmailField(verbose_name='email address',max_length=255,unique=True,db_index=True,)
     username = models.CharField(max_length=255, unique=True)
     date_of_birth = models.DateField()

     USERNAME_FIELD = 'email'
     REQUIRED_FIELDS = ['username', 'date_of_birth',]

     is_active = models.BooleanField(default=True)
     is_admin = models.BooleanField(default=False)
     is_staff = models.BooleanField(default=False)

     objects = PersonManager()

     def get_full_name(self):
         return self.email

     def get_short_name(self):
         return self.email

     def __unicode__(self):
         return self.email
61
задан 26 July 2013 в 09:50

2 ответа

Для кого-либо еще, кто мог бы столкнуться с этой проблемой, я также решил ее путем простого выполнения этого на forms.py:

добавляют это наверху forms.py файла

from .models import YourCustomUser

и затем добавляют это к Вашему forms.py CustomUser форма:

class SignUpForm(UserCreationForm):
#profile_year        = blaaa blaa blaaa irrelevant.. You have your own stuff here don't worry about it

   # here is the important part.. add a class Meta-
   class Meta:
      model = YourCustomUser #this is the "YourCustomUser" that you imported at the top of the file  
      fields = ('username', 'password1', 'password2', #etc etc, other fields you want displayed on the form)

БОЛЬШИЕ ПРИМЕЧАНИЯ, ВНИМАНИЕ :

  1. Этот код работал на мой случай. У меня есть представление для регистрации в системе пользователей, у меня была проблема здесь, и я решил ее, я не попробовал ее за входящих в систему пользователей.

  2. include = () часть требуется, или можно добавить exclude = (), но у Вас должен быть один

5
ответ дан 31 October 2019 в 15:32

Важный протест обновить вышеупомянутые решения... При направлении с этим видом проблемы Вы, вероятно, попробовали различные решения вокруг сети, говоря Вам добавить AUTH_USER_MODEL = users.CustomUser к settings.py и затем добавить следующий код к views.py forms.py и любой другой файл, который звонит User:

from django.contrib.auth import get_user_model
User = get_user_model()

И затем Вы царапаете голову, когда Вы получаете ошибку:

Manager isn't available; 'auth.User' has been swapped for 'users.User'

В любое время Ваши ссылки кода User, такие как:

User.objects.get()

Причина Вы знаете, что уже помещаете objects = UserManager() в свой пользовательский пользовательский класс (UserManager являющийся именем Вашего пользовательского менеджера, который расширяется BaseUserManager).

Хорошо как оказалось, выполнение:

User = get_user_model() # somewhere at the top of your .py file
# followed by
User.objects.get() # in a function/method of that same file

Не эквивалентно:

get_user_model().objects.get() # without the need for User = get_user_model() anywhere

, Возможно, не интуитивный, но оказывается, что это в Python, выполняясь User = get_user_model() однажды во время импорта затем не приводит к [1 116] определяемый через последующие вызовы (т.е. это не поворачивается User в своего рода "константу", которую Вы могли бы ожидать, происходите ли Вы из среды C/C++; означание, что выполнение [1 118] происходит во время импорта, но затем разыменовывается прежде последующее названный к классу или функции/методу в том файле).

Так, таким образом, во всех файлах, которые ссылаются User класс (например, вызывающие функции или переменные такой как [1 120] User.objects.all() User.DoesNotExist и т.д....):

# Add the following import line
from django.contrib.auth import get_user_model

# Replace all references to User with get_user_model() such as...
user = get_user_model().objects.get(pk=uid)
# instead of  user = User.objects.get(pk=uid)
# or
queryset = get_user_model().objects.all()
# instead of queryset = User.objects.all()
# etc...

Hope это помогает сэкономить другим некоторое время...

2
ответ дан 31 October 2019 в 15:32

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

Похожие вопросы: