Django - использование метода отношений 1-1 для создания двух разных профилей пользователей, одна и та же аутентификация - PullRequest
0 голосов
/ 22 июня 2019

У меня есть проект Django, в котором я в настоящее время использовал процесс аутентификации пользователя по умолчанию и расширил его, чтобы учесть профили пользователей. Теперь я хочу создать профили для двух разных типов пользователей, например, Тип пользователя 1: = WP. Тип пользователя 2: = W.

Я рассмотрел некоторые из предложенных решений, но хотел получить некоторые конкретные рекомендации по моему конкретному сценарию и коду.

Насколько я понимаю, есть три способа сделать это 1. Модель прокси 2. 1-1. Метод отношений (расширение пользовательской модели). 3. Пользовательская модель пользователя.

Я хочу использовать опцию № 2 - 1-1 «Метод отношений» и избегать двух других, с целью а) разрешить пользователям вход в систему b) позволяют пользователю указать, является ли он пользователем типа 1 (WP) или пользователем типа 2 (W) c) Если пользователь относится к типу пользователя 1 (WP), он направляется в профиль WP, а если пользователь относится к типу пользователя 2 (W), он направляется в профиль пользователя типа 2 (W).

У меня сейчас есть это в моем models.py (для пользователей)

from django.db import models
from django.contrib.auth.models import User
from PIL import Image
from django import forms


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self, *args, **kwargs):
        super(Profile, self).save(*args, **kwargs)
        img = Image.open(self.image.path)
        if img.height > 300 or img.width > 300:
            output_size = (300,300)
            img.thumbnail(output_size)
            img.save(self.image.path)

Смогу ли я подойти к нему, создав вместо этого две разные модели для двух разных необходимых профилей, как показано ниже?

from django.db import models
from django.contrib.auth.models import User
from PIL import Image
from django import forms


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self, *args, **kwargs):
        super(Profile, self).save(*args, **kwargs)
        img = Image.open(self.image.path)
        if img.height > 300 or img.width > 300:
            output_size = (300,300)
            img.thumbnail(output_size)
            img.save(self.image.path)

class WP(User):
    WP_name=models.CharField(max_length=100)
    description=models.TextField(max_length=300)

class W(User):
    company=models.CharField(max_length=100)
    requirements=models.TextField(max_length=300)
    date_posted=models.DateTimeField(default=timezone.now)

Мой views.py выглядит следующим образом, и я вызываю страницу профиля, и снова я бы создал логику, которая называла бы либо страницу профиля 1, либо страницу профиля 2, в зависимости от того, какой это тип пользователя?

views.py

#USERS (register) view.py
from django.shortcuts import render,redirect
from django.contrib.auth.forms import UserCreationForm
from django.contrib import messages #this allows us flash messages for testing
from django.contrib.auth.decorators import login_required
from .forms import UserRegisterForm
from .forms import UserUpdateForm
from .forms import ProfileUpdateForm

from django.contrib.auth.decorators import login_required

# Create your views here.

#Here we create python classes and they create html forms for us
#We want a registration form...so we can use the user creation form that already exists in Django

def register(request):
    if request.method =='POST':
        #this UserRegisterForm is created in forms.py and inherits from UserCreationForm (the ready made form)
        form = UserRegisterForm(request.POST) #create a form that has the data that was in request.POST
        if form.is_valid(): #is the form valid (do you have a username like this already, passwords match?
            form.save()#this just saves the account, hashes the password and it's all done for you!
            username = form.cleaned_data.get('username')
            messages.success(request,f'Account created for {username}, you can now login.')
            return redirect('socialmedia-moreinfo')

    else:
        form =UserRegisterForm() #if the form input is invalid, render the empty form again

    #above we are creating a blank form and rendering it to the template
    return render(request, 'users/register.html',{'form':form})
#different types of messages message . debug, inf success warning and error

@login_required #this is a decorator (adds functionality to an existing function)
def profile(request):
    if request.method =='POST':
        u_form =UserUpdateForm(request.POST,instance=request.user)
        p_form =ProfileUpdateForm(request.POST, request.FILES,instance=request.user.profile)

        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request,f'Your account has been updated')
            return redirect('profile')

    else:   
        u_form =UserUpdateForm(instance=request.user)
        p_form =ProfileUpdateForm(instance=request.user.profile)


    context={
            'u_form': u_form,
            'p_form': p_form
        }

    return render(request,'users/profile.html',context)
        #add a login required dectorator that django provides
        #we want a user to be logged in to view this profile view
        #see the very top to import decorators

Моя проблема в том, что я пытаюсь избежать маршрута пользовательской модели пользователя (для которого есть множество учебных пособий), но в учебных целях хочу подойти к нему таким образом.

Мои вопросы: 1. Как я могу решить эту проблему (какие изменения необходимо внести в модели и представления), чтобы создать два профиля пользователя, используя метод отношений 1-1.

  1. Я подхожу к этому совершенно неправильно? Должен ли я выйти из этого подхода и перейти к пользовательскому маршруту?

  2. Наконец, есть ли рекомендуемые учебники для начинающих, для создания проектов с несколькими пользователями. Я не мог найти ни одного! На youtube есть один, но включает REACT, что усложняет процесс и учебник.

Заранее спасибо.

...