2017-07-27 162 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