Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 除了Django中另一个视图中的块之外,如何启用函数来基于try呈现模板?_Python_Django_Django Templates_Django Views_Django Middleware - Fatal编程技术网

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

Python 除了Django中另一个视图中的块之外,如何启用函数来基于try呈现模板?,python,django,django-templates,django-views,django-middleware,Python,Django,Django Templates,Django Views,Django Middleware,我正在Django中创建一个应用程序,允许我的用户根据数据库中已存储的信息从我的站点订购物品 并非我的所有用户都应该能够订购某些商品,为此,我编写了一个带有比较语句的管道,并尝试了除块之外的其他功能 一小段可复制的代码如下所示: vendor.py views.py 挑战:我可以成功地将这个小脚本导入到我的视图中,我可以看到它的内容正在运行,除了返回渲染(请求、模板)部分 为了更好地解释我自己,try/except块成功捕获了异常,但是它不返回块中指定的模板,而是返回到视图并呈现视图中的模板 我

我正在Django中创建一个应用程序,允许我的用户根据数据库中已存储的信息从我的站点订购物品

并非我的所有用户都应该能够订购某些商品,为此,我编写了一个带有比较语句的管道,并尝试了除块之外的其他功能

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

vendor.py views.py 挑战:我可以成功地将这个小脚本导入到我的视图中,我可以看到它的内容正在运行,除了返回渲染(请求、模板)部分

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

我尝试了什么?如果我将guest_约束代码(vendor.py)放在index(views.py)中,我看不到任何问题,并且按照预期工作。然而,这并不能很好地扩展,因为我希望在views.py中为许多不同的函数调用guest_containt

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

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

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

vendor.py |已更新 views.py |已更新

看起来你可能想考虑使用注释而不是仅仅作为一个函数:

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

这意味着你需要确保注释的视图使用了Bug和RooMyFielsPARAMS,但这也意味着你要定义变量一次。

< P>看起来你可能想考虑使用注释而不是仅仅作为一个函数:

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_信息参数,但也意味着您只定义了一次变量。

您的示例视图.py使用guest_约束不显示任何内容,只显示导入。听起来你想在索引(和其他视图)中间检查GuestSub约束。处理它的一个简单方法是返回两个值—结果状态和render()结果。将
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
在views.py中,您可以:

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

您的示例views.py没有使用guest_约束显示任何内容,只显示导入。听起来你想在索引(和其他视图)中间检查GuestSub约束。处理它的一个简单方法是返回两个值—结果状态和render()结果。将
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
在views.py中,您可以:

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

我没有看到
index
视图中使用的
guest\u约束
方法。对此表示歉意,我无意中忽略了如何在views.py函数中使用该函数。现在已更正。我没有看到您的
索引
视图中使用的
guest\u约束
方法。对此表示歉意,我无意中忽略了如何在views.py函数中使用该函数。现在更正了。嘿,非常感谢你的回复。我已经尝试过实现它,我觉得这是我想要的方式。我不知怎的犯了个错误。看起来,当请求通过所有这些过滤器时(因为用户有资格这样做),Django抛出一个非类型异常。您知道guest_约束注释将流返回到views.py函数的方法吗?这样,只要guest通过这些约束,我就可以呈现自己喜欢的模板?考虑到这一点,我真的很想在所有视图中使用此注释。忽略上面的消息。我可以在需要编辑的地方编辑代码。谢谢你抽出时间回答这个问题。嘿,非常感谢你的回答。我已经尝试过实现它,我觉得这是我想要的方式。我不知怎的犯了个错误。看起来,当请求通过所有这些过滤器时(因为用户有资格这样做),Django抛出一个非类型异常。您知道guest_约束注释将流返回到views.py函数的方法吗?这样,只要guest通过这些约束,我就可以呈现自己喜欢的模板?考虑到这一点,我真的很想在所有视图中使用此注释。忽略上面的消息。我可以在需要编辑的地方编辑代码。谢谢你抽出时间回答这个问题。谢谢你的朋友。我决定选择使用与注释相同的其他响应。谢谢这位朋友。我决定选择使用另一个响应,它对注释也有同样的作用。