Я с помощью пользовательской модели по умолчанию в 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
Для кого-либо еще, кто мог бы столкнуться с этой проблемой, я также решил ее путем простого выполнения этого на 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)
БОЛЬШИЕ ПРИМЕЧАНИЯ, ВНИМАНИЕ :
Этот код работал на мой случай. У меня есть представление для регистрации в системе пользователей, у меня была проблема здесь, и я решил ее, я не попробовал ее за входящих в систему пользователей.
include = ()
часть требуется, или можно добавить exclude = ()
, но у Вас должен быть один
Важный протест обновить вышеупомянутые решения... При направлении с этим видом проблемы Вы, вероятно, попробовали различные решения вокруг сети, говоря Вам добавить 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 это помогает сэкономить другим некоторое время...