Как настроить модель Django Users? - PullRequest
0 голосов
/ 21 января 2020

В настоящее время я добавил функцию регистрации на свой веб-сайт благодаря модели Users из django.contrib.auth.models и хочу добавить поле score, которое даст по умолчанию 100 баллов после регистрации пользователя. У меня есть следующий код для регистрации пользователя:

forms.py 

from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

class UserRegisterForm(UserCreationForm):
    first_name = forms.CharField(max_length=25)
    last_name  = forms.CharField(max_length=25)
    email      = forms.EmailField()
    score      = forms.CharField(max_length=5) # max value 99,999

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username', 'email', 'password1', 'password2']

views.py

from .forms import UserRegisterForm
from django.shortcuts import render, redirect

def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'accounts/register.html', {'form': form}

В настоящее время проблема с моим кодом состоит в том, что форма отображает поле points, которое не должно иметь место, и я не уверен, как указать Django что каждый раз, когда пользователь регистрируется, он должен получить 100 баллов. Когда я использовал postgresql db, я реализовал это как значение по умолчанию, то есть score = models.IntegerField(default=100), но это поведение не работает для модели Users из from django.contrib.auth.models import User, потому что вы получите ошибку __init__() got an unexpected keyword argument 'default' Любая помощь, редактирование или любой другой вклад в этот вопрос будет принята с благодарностью :)

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Извините, что я не могу комментировать, но попытался заменить пользовательскую модель ?

В то время как в ваших settings.py :

AUTH_USER_MODEL = 'myapp.MyUser'

и я хочу добавить поле оценки, которое будет давать по умолчанию

Я не думаю, что по умолчанию для пользователя Django по умолчанию будет поле score Таким образом, вам, возможно, придется создать свою собственную пользовательскую модель, расширив класс Django AbstractUser и добавив свое поле.

1 голос
/ 22 января 2020

Благодаря предложениям @cpy24 и @aris24 я нашел решение для настройки моделей Users.

models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class MyAccountManager(BaseUserManager):

    def create_user(self, email, username, first_name, last_name, score, password=None):

        if not email:
            raise ValueError("User must have an email address.")
        if not username:
            raise ValueError("User must have a username.")
        if not first_name:
            raise ValueError("User must have a first name.")
        if not last_name:
            raise ValueError("User must have a last name.")

        user = self.model(email=self.normalize_email(email),
            username=username,
            first_name = first_name,
            last_name = last_name,
            score = score,
      )

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

    def create_superuser(self, email, username, first_name, last_name, score, password):

        user = self.create_user(email=self.normalize_email(email),
           username=username,
           first_name = first_name,
           last_name = last_name,
           score = score,
           password=password, 
      )

         user.is_admin = True
         user.is_staff = True
         user.is_superuser = True
         user.save(using=self._db)
         return user


class Account(AbstractBaseUser):
    email        = models.EmailField(verbose_name="email", max_length=60, unique=True)
    username     = models.CharField(max_length=30, unique=True)
    first_name   = models.CharField(max_length=25)
    last_name    = models.CharField(max_length=25)
    score        = models.FloatField(default=100)

    # The following fields are required for every customer User model
    last_login   = models.DateTimeField(verbose_name='last login', auto_now=True)
    date_joined  = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    is_admin     = models.BooleanField(default=False)
    is_active    = models.BooleanField(default=True)
    is_staff     = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['username', 'first_name', 'last_name', 'score']

    objects = MyAccountManager()

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

А потом просто я go мой forms.py и добавляю следующее:

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreation

User = get_user_model()

class UserRegisterForm(UserCreationForm):
    class Meta:
        model = User
        fields = ['first_name','last_name','username','email', 'password1', 'password2']        

Наконец, я go к settings.py основного приложения и добавлю следующее:

AUTH_USER_MODEL = 'accounts.Account'
...