Что мне делать, если расширить модель пользователя по сравнению с пользовательским режимом Django 2020? - PullRequest
0 голосов
/ 14 марта 2020

Итак, я создаю приложение для знакомств с нуля в Django. Первый проект, и новый для программирования. Я хочу заставить пользователя загрузить фотографию при регистрации. Я попытался сделать это только с расширением пользовательской модели, но я огляделся и попробовал разные вещи, но не смог понять это, поэтому я решил создать пользовательскую пользовательскую модель. Тем не менее, я сталкиваюсь с проблемами влево и вправо, и я думаю, что я чрезмерно обдумываю вещи, добавляя пользовательскую модель. Как я могу заставить пользователя загружать фотографию во время регистрации, расширяя обычную модель пользователя?

Изменить: Если я ошибаюсь, и пользовательскую модель действительно проще и лучше, пожалуйста, дайте мне знать и почему

Models.py

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




class ProfileManager(BaseUserManager):



    def create_user(self, username, email,description,photo, password=None):
        if not email:
            raise ValueError("You must creat an email")
        if not username:
            raise ValueError("You must create a username!")
        if not description:
            raise ValueError("You must write a description")
        if not photo:
            raise ValueError("You must upload a photo")

        user = self.model(
                email=self.normalize_email(email),
                username = username, 
                description= description,
                photo= photo,

            )

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


    def create_superuser(self, username, email,description,photo, password):
        user = self.create_user(
                email=self.normalize_email(email),
                password=password,
                username=username,
                description=description,
                photo=photo,

            )

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




class Profile(AbstractBaseUser):

    email                       = models.EmailField(verbose_name="email")
    username                    = models.CharField(max_length=30, unique=True)
    date_joined                 = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login                  = models.DateTimeField(verbose_name='last login', auto_now=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)
    #what I added
    description                 = models.TextField()
    photo                       = models.ImageField(upload_to='profile_photo',blank=False, height_field=None, width_field=None, max_length=100)
    owner                       = models.ForeignKey(User, on_delete=models.CASCADE)


    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['description','photo','email']


    objects = ProfileManager()


    def __str__(self):
        return self.username


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


    def has_module_perms(self,app_label):
        return True

views.py

def register(request, profile_id):
    user =User.objects.get(pk=profile_id)
    user.profile.bio = 'fjfjfjjf'
    user.save()


def register(request):
    #Register a new user
    context = {}

    if request.POST:
        form = RegistrationForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            email = form.cleaned_data.get("email")
            description = form.cleaned_data.get("description")
            photo = form.cleaned_data.get("photo")
            raw_password = form.cleaned_data.get('password1')
            profile = authenticate(username=username,email=email,description=description, photo=photo, password=raw_password)
            login(request, profile)
            return redirect ('dating_app:home')
        else:
            context['registration_form'] = form
    else: #get request 
        form = RegistrationForm()
        context['registration_form'] = form
    return render(request, 'dating_app/register.html', context)

forms.py

rom django import forms
from django.contrib.auth.forms import UserCreationForm

from dating_app.models import Profile




class RegistrationForm(UserCreationForm):


    class Meta:
        model = Profile 
        fields = ("username","email","description","photo","password1","password2")

регистр. html

{% extends "dating_app/base.html" %}

{% block content %}

<h1>Register</h1>


    <form method="post" action="{% url 'dating_app:register' %}" enctype="multipart/form-data">
        {% csrf_token %}
        {% for field in registration_form %}
            <p>
                {{field.label_tag}}
                {{field}}

                {% if field.help_text %}
                    <small style="color:grey;">{{field.help_text}}</small>
                {% endif %}

                {% for error in field.errors %}
                    <p style="color: red;">{{error}}"</p>
                {% endfor %}
            </p>
        {% endfor %}
        <button type="submit">Register</button>
    </form>


{% endblock content %}

settings.py

AUTH_USER_MODEL = 'dating_app.Profile'
...