从外部方法调用时调用"return render"不起作用(Django,views.py)



这是第一个问题。

我在创建可在我的 views.py 文件中用于处理用户身份验证的可重用方法时遇到问题。我创建并导入了一个如下所示的 utils.py 文件:

from django.shortcuts import render
from django.contrib.auth.forms import AuthenticationForm
def check_log_in(request):
    username = None
    if request.user.is_authenticated():
        user = request.user
        if user.is_staff == False:
            message = "You are not an authorized staff member."
            form = AuthenticationForm()
            context = {'form': form,
                       'message': message}
            return render(request, 'obits/login.html', context)
    else:
        message = "Please log-in to add a new record."
        form = AuthenticationForm()
        context = {'form': form,
                   'message': message}
        return render(request, 'obits/login.html', context)

如果我将相同的代码直接放入我的视图中,它工作得很好,但现在我把它作为一个单独的方法,它不会在返回渲染时中断,而是继续通过代码。我使用 print 语句来测试它是否正确调用,并且确实如此。以下是当前视图:

def new(request):
    check_log_in(request)
    if request.method == 'POST':
        if form.is_valid():
            #code, yada, yada, context
            return render(request, 'obits/detail.html', context)
        else:
            #code, yada, yada, context
            return render(request, 'obits/new.html', context)
    else:
        #code, yada, yada, context
        return render(request, 'obits/new.html', context)

在当前的设置中,它将检测到用户未登录,但仍会继续显示新的.html页面,而不是重定向到登录。但是,如果我剪切并粘贴check_log_in中包含的确切代码,而不仅仅是调用它,它就可以正常工作。

有什么想法吗?提前谢谢你!

如果从check_log_in()返回,但对返回的值不执行任何操作,则new()视图的执行将继续。

您需要检查check_log_in()是否返回了某些内容,如果是,请从new()视图中返回该内容:

def new(request):
    response = check_log_in(request)
    if response is not None:
        return response
    if request.method == 'POST':
        # rest of your code

最新更新