如何 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
因此,要按照您的意愿去做(为每个用户帐户分配特定类型),您必须检查他们是否有 restaurant
或 customer
相关他们的帐户。
我建议做的是创建一个单独的用户配置文件 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
我正在尝试创建两个用户;顾客和餐厅。我使用 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
因此,要按照您的意愿去做(为每个用户帐户分配特定类型),您必须检查他们是否有 restaurant
或 customer
相关他们的帐户。
我建议做的是创建一个单独的用户配置文件 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