【问题标题】:How can I differentiate between users with lookup如何通过查找区分用户
【发布时间】:2017-07-28 04:48:18
【问题描述】:

我有两个类CustomerRestaurantOneToOneField 和内置的django User。当我转到一个页面时,我试图确定它是哪个User。我正在做的事情不起作用,因为 User 模型将始终返回 True 因为具有 restaurant 属性,所以它永远不会超过第一个 if 语句...

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 dashboard(request):
    if User.restaurant:
        return render(request,'usermanage/dashboard_restaurant.html')
    elif User.customer is not None:
        return redirect(request, 'usermanage/dashboard.html')
    else:
        return render(request, 'usermanage/dashboard.html')

【问题讨论】:

  • 您应该在CustomUser 模型中设置一个标志或状态字段或角色字段来描述用户类型。然后,您可以在没有任何复杂性的情况下区分两者。否则,Django 无法区分 Restaurant 用户和 Customer 用户。

标签: python django one-to-one


【解决方案1】:

您的视图文件正在检查User 模型上的restaurant 属性而不是实例,这不是您在Django 中使用模型的方式,请阅读Django's ORM 上的文档以了解正确用法。您可以使用request.user 从请求中访问经过身份验证的用户。你应该这样做:

def dashboard(request):
    user = request.user
    if user and hasattr(user, 'restaurant'):
        return render(request,'usermanage/dashboard_restaurant.html')
    elif user and hasattr(user, 'customer') is not None:
        return redirect(request, 'usermanage/dashboard.html')
    else:
        return render(request, 'usermanage/dashboard.html')

确保您阅读了有关 Django 的 OneToOneField 和 ORM 的文档。如果您参考One-to-one relationship documentation,您会阅读:

from django.core.exceptions import ObjectDoesNotExist  
try:  
    p2.restaurant  
except ObjectDoesNotExist:  
    print("There is no restaurant here.")  

这里没有餐厅。

你也可以使用 hasattr 来避免异常捕获:

hasattr(p2, 'restaurant')  

错误

这两个示例之一应该是您如何检查用户上缺少的restaurant

【讨论】:

  • 我尝试 request.user 有一段时间没有运气。我仍然收到此方法的错误:Exception Value: User has no restaurant.
猜你喜欢
  • 2016-02-11
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 2020-06-25
  • 2020-01-19
  • 1970-01-01
  • 2018-09-25
相关资源
最近更新 更多