如何 create/signup 不同的用户类型

How to create/signup different User types

我正在尝试创建两个用户;顾客和餐厅。我使用 OneToOneField 将这些与 Django 用户模型相关联。我对应该如何创建特定类型的用户感到困惑。当我创建用户时,我如何区分哪个是客户,哪个是餐厅?这就是我目前为止,它似乎工作但不觉得它很优雅..

models.py

class Restaurant(models.Model):
    restaurant_user = models.OneToOneField(User, on_delete=models.CASCADE)
    restaurant_name = models.TextField(max_length=50)
    about = models.CharField(max_length=500)


class Customer(models.Model):
    customer_user = models.OneToOneField(User, on_delete=models.CASCADE)
    about = models.CharField(max_length=500)

views.py

def signup_customer(request):
    if request.method == 'POST':
        form = SignupForm(request.POST)
        if form.is_valid():
            first_name = request.POST['first_name']
            last_name = request.POST['last_name']
            username = request.POST['username']
            password = request.POST['password']
            email = request.POST['email']

            #TO DO CHECK IF IT ALREADY EXISTS

            user1 = User.objects.create_user(username=username, password=password,
                                            email=email)
            user1.save()
            user = Customer(customer_user=user1)

            login(request, user1)
        return redirect('dashboard')

您将能够通过以下方式从用户对象访问不同的关系:

user = User.objects.first()
user.restaurant
user.customer

因此,要按照您的意愿去做(为每个用户帐户分配特定类型),您必须检查他们是否有 restaurantcustomer 相关他们的帐户。

我建议做的是创建一个单独的用户配置文件 table 来存储特定于用户的附加信息,这些信息在客户和餐厅之间是相似的,并且有一个您可以在那里检查的标志。

您可以通过 Django Groups 实现此用例:

Create two groups as Customer and Restaurant in shell_plus or management command or Django admin

Group.objects.create(name="Customer")
Group.objects.create(name="Restaurant")

Create two different models for Customer and Restaurant with user field relation as One to One Mapping.

# models.py

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

class Customer(models.Model):
    """
    Customer Schema
    """
    user = models.OneToOneField(User)
    # add below customer attributes 

    def __str__(self):
       return self.user.first_name


class Restaruant(models.Model):
    """
    Restaruant Schema
    """
    user = models.OneToOneField(User)
    # add below restaruant attributes

    def __str__(self):
        return self.user.first_name

Hold the group objects of Customer and Restaurant in constants file

# utils.py
from django.contrib.auth.models import Group

RESTARUANT_GROUP = Group.objects.get(name="Restaruant")
CLIENT_GROUP = Group.objects.get(name="Client")

While creating a user object, add the user to the requested group (RESTARUANT_GROUP, CLIENT_GROUP) and save the user object.

#views.py
from django.contrib.auth import authenticate
from utils import RESTARUANT_GROUP, CLIENT_GROUP

def signup(request):
    if request.method == "POST":
        email = request.POST.get('email')
        first_name = request.POST.get('first_name')
        last_name = request.POST.get('last_name')
        password = request.POST.get('password')
        user_type = request.POST.get('user_type') # user_type value would be client/restaruant
        user = User.objects.create(
            username=email,
            first_name=first_name,
            last_name=last_name
        )
        user.set_password(password)
        if user_type == "Restaruant":
            user.groups.add(RESTARUANT_GROUP)
        else:
            user.groups.add(CLIENT_GROUP)

        user.save()

While user login, check user is authenticated or not and redirect to the user page based on the user's group.

def login(request):
    email = request.POST.get('email')
    password = request.POST.get('password')
    user = authenticate(username=email, password=password) # user authentication
    user = User.objects.get(id=user.id)
    if RESTARUANT_GROUP in user.groups.all(): # check user belongs to RESTARUANT_GROUP
        login(request, user)
        # redirect to restaruant page
    elif CLIENT_GROUP in user.groups.all(): # check user belongs to CLIENT_GROUP
        login(request, user)
        # redirect to client page
    else:
        # redirect to home page