如何启用函数来呈现基于try的模板,除了Django中其他视图中的块之外?

2024-10-03 09:18:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Django中创建一个应用程序,允许我的用户根据数据库中已存储的信息从我的网站订购商品。你知道吗

并非所有用户都应该能够订购某些商品,为此,我编写了一个包含比较语句和try的管道,但块除外。你知道吗

一小段可复制的代码如下所示:

你知道吗供应商.py你知道吗

def guest_constraint(request)
    # Ensure user in request is a house-guest by checking if it has an active token.
    try:
        guest = GuestProfile.objects.get(user=request.user.id)
    except ObjectDoesNotExist:
        return render(request, 'extGuest/appGuestError/not_hotel_login.html')

    # Check for Hotel Room Information linked to Guest Token
    try:
        room_information = RoomInformation.objects.get(guest_token=guest.token)
    except ObjectDoesNotExist:
        return render(request, 'extGuest/appGuestError/constraint_error.html')

你知道吗视图.py你知道吗

from .vendor import guest_constraint

@login_required
def index(request):
    guest_contraint(request)  # Filter out users with no access to this process.
    user = request.user  # Grab user defined in request.
    name = user.get_short_name()  # Grab first name of user.

    return render(request, 'extGuest/appGuestFlow/choose_order_type.html')

挑战:我可以成功地将这个小脚本导入到我的视图中,我可以看到它的内容正在运行,除了返回呈现(请求,模板)部分。你知道吗

为了更好地解释我自己,try/except块成功地捕获了异常,但是它不返回块中指定的模板,而是返回到视图并呈现视图中的模板。你知道吗

我试过什么?如果我将客户代码(供应商.py)把它放在索引里(视图.py)我看没有问题,工作如期。不过,这并不能很好地扩展,因为我希望为中的许多不同函数调用guest\u containt视图.py你知道吗

我对编程和Django还比较陌生,我还有很多东西要学。如果您能告诉我您认为我做错了什么,或者Django(甚至是基本Python)的什么主题可以帮助我解决这个问题,我们将不胜感激。谢谢!你知道吗

编辑:我忘了提到,我使用的是Django 1.11.6
编辑2:是的,我忘了在索引视图中包括如何使用函数。我的错,对不起。你知道吗

解决方案:

多亏了@cwallenpole和我对他的回复所做的一些更改,我才能够编辑代码来完成我想做的事情,现在看起来是这样的:

你知道吗供应商.py|更新

def guest_constraint(function):
    def _inner_guest_constraint(request)
        # This part should be familiar
        try:
            guest = GuestProfile.objects.get(user=request.user.id)
        except ObjectDoesNotExist:
        return render(request, 'extGuest/appGuestError/not_hotel_login.html')

    try:
        room_information = RoomInformation.objects.get(guest_token=guest.token)
    except ObjectDoesNotExist:
            return render(request, 'extGuest/appGuestError/constraint_error.html')

    # Once all checks are passed return flow back to function.
    return function(request)

# return the wrapping
return _inner_guest_constraint

你知道吗视图.py|更新

from .vendor import guest_constraint

@login_required
@guest_constraint
def index(request):
    user = request.user  # Grab user defined in request.
    name = user.get_short_name()  # Grab first name of user.

    return render(request, 'extGuest/appGuestFlow/choose_order_type.html')

Tags: namepytoken视图getreturnrequestdef
2条回答

你的样品视图.py不显示任何使用guest\u约束的内容,只显示导入。听起来您希望在索引(和其他视图)的中间有一个检查guest\u约束的东西。处理它的一个简单方法是返回两个值—result status和render()results。将False添加到每个现有的return render()行和函数return True, None的末尾。全部功能变为:

def guest_constraint(request)
    # Ensure user in request is a house-guest by checking if it has an active token.
    try:
        guest = GuestProfile.objects.get(user=request.user.id)
    except ObjectDoesNotExist:
        return False, render(request, 'extGuest/appGuestError/not_hotel_login.html')

    # Check for Hotel Room Information linked to Guest Token
    try:
        room_information = RoomInformation.objects.get(guest_token=guest.token)
except ObjectDoesNotExist:
        return False, render(request, 'extGuest/appGuestError/constraint_error.html')

    # Everything is good
    return True, None

而且在视图.py你可以:

constraint_ok, constraint_render = guest_constraint(request)
if not constraint_ok:
    return constraint_render

似乎您应该考虑使用注释,而不仅仅是函数:

def guest_constraint(fn):
    def _inner_guest_constraint(request)
        # This part should be familiar
        try:
            guest = GuestProfile.objects.get(user=request.user.id)
        except ObjectDoesNotExist:
            return render(request, 'extGuest/appGuestError/not_hotel_login.html')

        try:
            room_information = RoomInformation.objects.get(guest_token=guest.token)
        except ObjectDoesNotExist:
            return render(request, 'extGuest/appGuestError/constraint_error.html')

        # Call the wrapped function
        fn(request)

    # return the wrapping
    return _inner_guest_constraint

然后你可以简单地注释:

@login_required
@guest_constraint
def index(request):

也可以对其进行修改,以便包装函数添加参数:

def guest_constraint(fn):
    def _inner_guest_constraint(*args,**kwargs):
        # stuff
        kwargs.update({'guest':guest, 'room_info': room_information})
        fn(*args,**kwargs)
    return _inner_guest_constraint

这意味着您需要确保注释视图采用guest和room_info参数,但也意味着您只需定义一次变量。你知道吗

相关问题 更多 >