Добавление поля XP в модель пользователя по умолчанию - PullRequest
0 голосов
/ 31 марта 2019

Итак, в последний час я пытался внедрить поле XP в модель пользователя по умолчанию. Я изучил django docs и увидел, что есть два способа настройки аутентификации - либо расширение модели User, либо ее изменение.

Я решил просто расширить его, потому что мне нужно только добавить еще два или три поля в будущем. (Я пытаюсь добавить только это поле XP RS, чтобы я мог получить, как это должно быть сделано)

Я думал, что сделал это, пока не получил эту ошибку: Объект «Менеджер» не имеет атрибута «create_user»

Насколько я знаю, это происходит потому, что метод create_user привязан к User, и я изменил модель. Вот строка, которая создает ошибку:

user = Utilizator.objects.create_user(username=username, password=password, email=email, first_name=first_name, last_name=last_name)

Так что я делаю это неправильно.

Вот код: views.py

from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.models import User
from .models import Utilizator
from django.contrib import auth

# Create your views here.
def login(req):
    if req.method == 'POST':
        username = req.POST['username']
        password = req.POST['password']
        user = auth.authenticate(username=username, password=password)
        if user is not None:
            auth.login(req, user)
            messages.success(req, 'Acum eşti logat')
            return redirect('dashboard')
        else:
            messages.error(req, 'Numele de utilizator sau parola sunt greşite')
            return redirect('login')
        return
    else:
        return render(req, "../templates/pagini/login.html")
def register(req):
    if req.method == 'POST':
        first_name = req.POST['first_name']
        last_name = req.POST['last_name']
        username = req.POST['username']
        email = req.POST['email']
        password = req.POST['password']
        password2 = req.POST['password2']

        if password == password2:
            if User.objects.filter(username=username).exists():
                messages.error(req, 'Numele de utilizator deja există')
                return redirect('register')
            else:
                if User.objects.filter(email=email).exists():
                    messages.error(req, 'E-mailul este deja folosit')
                    return redirect('register')
                else:
                    user = Utilizator.objects.create_user(username=username, password=password, email=email, first_name=first_name, last_name=last_name)
                    user.save()
                    messages.success(req, 'Acum eşti logat')
                    return redirect('login')
        else:
            messages.error(req, 'Parolele diferă')
            return redirect('register')
    else:
        return render(req, "../templates/pagini/register.html")
def dashboard(req):
    return render(req, "../templates/pagini/dashboard.html")

models.py

from django.db import models
from django.contrib.auth.models import User

class Utilizator(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    xp = models.IntegerField(default=0)

Я понятия не имею, является ли это правильным способом сделать это. Я новичок и хочу узнать, как это сделать.

Так можно ли использовать этот models.py? Если это так, что я должен изменить на views.py?

Если нет, можете ли вы научить меня, как я должен делать все это? Большое спасибо.

1 Ответ

0 голосов
/ 31 марта 2019

Вы очень близки.Как вы сказали, есть 2 основных способа расширения User.1) Создайте новую модель и наследуйте от AbstractUser (сложная) или 2) Создайте отдельную модель с отношением 1: 1 (проще, как вы сделали).

Базовая реализациярасширить объект User с помощью UserProfile, а затем сделать его доступным / автоматически генерируемым при каждом вызове user.profile.

Пример:

class UserProfile(models.Model):
    """ Extends the User model with a UserProfile """
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='userprofileAsUser')
    xp = models.IntegerField(default=0)

    uuid = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)

    def __str__(self):
        return '{0}'.format(self.user.username)

    class Meta:
        verbose_name = "user profile"
        verbose_name_plural = "user profiles"

def get_or_create_profile(user):
    profile, created = UserProfile.objects.get_or_create(user=user)
    return profile

User.profile = property(get_or_create_profile)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...