2017-07-27 164 views
0

我想创建两个用户;顾客和餐馆。我使用OneToOneField将它们与Django User模型关联起来。我很困惑我应该如何去创建特定类型的用户。当我创建用户时,我该如何区分哪些是客户,哪些是餐厅?这是我迄今,似乎工作,但不觉得它是很优雅..如何创建/注册不同的用户类型

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') 

回答

0

您将能够通过去访问用户对象的不同关系:

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

因此,要做它听起来像你想要做的事情(指定spe每个用户帐户都有不同的类型),您需要检查他们的帐户是否有restaurantcustomer

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

+0

正确的,但这是去保存不同类型的用户以正确的方式? – ratrace123

+0

它没有任何明显的错误。尽管如此,还是有更好的方法。但是这涉及阅读文档。尽管看起来你没有使用从request.POST中提取的任何附加信息。 –

+0

你可以做的是创建一个post_save信号。我会在一分钟内回答我的答案。 –

0

您可以通过Django的组实现这个用例:

shell_plus创建两组客户和餐厅管理命令Django管理

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

一对一的映射为客户创造和餐厅两种不同的模式与用户的关系领域。

# 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 

保持客户和餐厅的常量对象组文件

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

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

在创建用户对象,用户添加请求的组(RESTARUANT_GROUP, CLIENT_GROUP)并保存用户对象。

#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() 

当用户登录,检查用户身份验证或不并重定向到基于该用户组用户页面。

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