1

如果未执行登录,我正在尝试创建受限用户编辑页面。

登录后,编辑页面打开,URL 中包含任何 user_id。

虽然编辑页面应该只在 user_id 已经登录用户的情况下打开。

例如,我使用 user_id=7 登录,因此只有一个下一个 url ( http://127.0.0.1:8000/user/7/edit ) 必须有权访问编辑页面。

这个编辑页面也可以通过任何下一个 url ( http://127.0.0.1:8000/user/ /edit)

我的代码中是否有任何错误或错误?

我已经清除了 Opera 和 Chrome 中的缓存,但问题仍然存在。

姜戈版本。1.11.9。

LOGIN_URL 未在 settings.py 中定义

网址.py

urlpatterns = [
    url(r'^login/$', user_login, name='user-login',),
    url(r'^(?P<user_id>\d+)/edit$', user_edit, name='user-edit',),
]

视图.py

def user_login(request):
    login_form = AuthenticationForm(request.POST or None)

    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user:
            login(request, user)
            print("next is {}".format(request.GET.get('next')))
            return redirect(user_edit, user.id)
        else:
            return redirect(user_login)

    return render(request, 'user_login.html', {'form': login_form})


@login_required(login_url='/user/login/')
def user_edit(request, user_id):
    print(request, request.user)
    print("next is {}".format(request.GET.get('next')))
    return render(request, 'user_edit.html', {'userid': user_id, 'user': request.user})
4

1 回答 1

1

装饰器login_required只检查用户是否登录。如果你想检查登录用户是否可以访问一个对象,那么你需要在视图中进行。例如:

from django.http import Http404

@login_required(login_url='/user/login/')
def user_edit(request, user_id):
    print(request, request.user)
    if request.user.id != user_id:
        raise Http404
    return render(request, 'user_edit.html', {'userid': user_id, 'user': request.user})
于 2018-01-08T15:08:22.087 回答