如果问题非常明显,我很抱歉,但我还是Django的新手。
我有查看:
import logging
@login_required(login_url='/accounts/login/')
def index(request):
return render(request, 'post.html', {})
def new(request):
return render(request, 'post-add.html',)
如果我转到POST页面,Login会正确重定向,但如果我要POST ADD,则不需要登录。
我是否正确使用登录要求?
答案 0 :(得分:1)
如果你想在没有登录的情况下尝试打开“post-add”时重定向,你需要另一个装饰器(@login_required(login_url ='/ accounts / login /') )。
答案 1 :(得分:0)
您必须将@login_required
装饰器应用于您要求登录的每个视图:
@login_required(login_url='/accounts/login/')
def index(request):
return render(request, 'post.html', {})
@login_required(login_url='/accounts/login/')
def new(request):
return render(request, 'post-add.html', {})
答案 2 :(得分:0)
正如其他人指出的那样,您必须在每个需要身份验证的视图上使用登录装饰器。
您可以通过简单地包装它来重复使用它:
auth = login_required(login_url='/accounts/login/')
@auth
def index(request):
return render(request, 'post.html', {})
@auth
def new(request):
return render(request, 'post-add.html',)
或者如果你喜欢基于类的视图,我更喜欢这个:
class AuthMixin(object):
@method_decorator(login_required(login_url='/accounts/login/'))
def dispatch(self, *args, **kwargs):
return super(AuthMixin, self).dispatch(*args, **kwargs)
class IndexView(AuthMixin, TemplateView):
template_name = 'post.html'
class AddView(AuthMixin, TemplateView):
template_name = 'post-add.html'
为了简化它,您可以使mixin继承自TemplateView,并将其用作所有登录所需视图的单个基类。
使用这两种方法从设置中检索登录网址也是一个好主意。