Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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 如果用户已经登录,则限制访问PasswordResetView中Django的reset_密码表单_Python_Django_Django Forms_Django Views_Backend - Fatal编程技术网

Python 如果用户已经登录,则限制访问PasswordResetView中Django的reset_密码表单

Python 如果用户已经登录,则限制访问PasswordResetView中Django的reset_密码表单,python,django,django-forms,django-views,backend,Python,Django,Django Forms,Django Views,Backend,目前,我有一个用户模型,可以根据会话访问帐户相关信息。我正在使用django auth密码重置视图。密码重置表单用于在用户忘记其密码时重置密码。但是当用户已经登录时,这个Django视图也会被用户访问 如何限制用户访问此页面?我找不到这个问题的解决方案,因为它是一个完整的抽象,在我的views.py文件中没有任何内容 这就是我的url.py文件的外观: from django.contrib import admin from django.urls import path, include f

目前,我有一个用户模型,可以根据会话访问帐户相关信息。我正在使用django auth
密码重置视图
。密码重置表单用于在用户忘记其密码时重置密码。但是当用户已经登录时,这个Django视图也会被用户访问

如何限制用户访问此页面?我找不到这个问题的解决方案,因为它是一个完整的抽象,在我的
views.py
文件中没有任何内容

这就是我的url.py文件的外观:

from django.contrib import admin
from django.urls import path, include
from django.contrib.auth import views as auth_views
from users import views as user_views

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('mainapp.urls')),
    path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name="login"),
    path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name="logout"),
    path('password_reset/', auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'), name="password_reset"),
    path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'), name="password_reset_done"),
    path('password_reset_confirm/<uidb64>/<token>', auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'), name="password_reset_confirm"),
    path('password_reset_complete/', auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'), name="password_reset_complete"),
    path('change_password/', auth_views.PasswordChangeView.as_view(template_name='users/change_password.html', success_url="/"), name="password_change"),
    # path('password_change_done/done/', auth_views.PasswordChangeDoneView.as_view(template_name='users/password_change_done.html'), name="password_change_done"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
来自django.contrib导入管理
从django.url导入路径,包括
从django.contrib.auth导入视图作为auth_视图
从用户将视图作为用户视图导入
从django.conf导入设置
从django.conf.url.static导入静态
URL模式=[
路径('admin/',admin.site.url),
路径(“”,include('mainapp.url'),
路径('login/',auth_views.LoginView.as_view(template_name='users/login.html'),name=“login”),
path('logout/',auth_views.LogoutView.as_view(template_name='users/logout.html'),name=“logout”),
路径('password_reset/',auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'),name=“password_reset”),
路径('password\u reset/done/',auth\u views.PasswordResetDoneView.as\u view(template\u name='users/password\u reset\u done.html'),name=“password\u reset\u done”),
路径('password\u reset\u confirm/',auth\u views.PasswordResetConfirmView.as\u view(template\u name='users/password\u reset\u confirm.html'),name=“password\u reset\u confirm”),
路径('password\u reset\u complete/',auth\u views.passwordresetcomplete view.as\u view(template\u name='users/password\u reset\u complete.html'),name=“password\u reset\u complete”),
路径('change_password/',auth_views.PasswordChangeView.as_view(template_name='users/change_password.html',success_url=“/”,name=“password_change”),
#路径('password\u change\u done/done/',auth\u views.PasswordChangeDoneView.as\u view(template\u name='users/password\u change\u done.html'),name=“password\u change\u done”),
]+静态(settings.MEDIA\u URL,document\u root=settings.MEDIA\u root)

登录的用户不应该能够访问密码重置表单,因为这只意味着当忘记密码时,并且当用户已经登录时,用户访问
密码重置.html
是没有意义的

有多种方法可以做到这一点;然而,我认为最快的解决方案是编写一个装饰程序:

def login_forbidden(function=None):
    actual_decorator = user_passes_test(
        lambda u: u.is_anonymous,
    )
    if function:
        return actual_decorator(function)
    return actual_decorator
并使用它装饰密码重置视图,其中您希望将访问权限仅限于未经身份验证的用户:

path('password_reset/', login_forbidden(auth_views.PasswordResetView.as_view(template_name='users/password_reset.html')), name="password_reset")

或者,您可以覆盖实际视图。

如果您真的想修改默认视图,一个选项是对它们进行子类化,并在URL中使用它们

在您的视图中(使用类):

在您的URL中:

from .views import MyPasswordResetView

...
    path(
        'password_reset/', 
        MyPasswordResetView.as_view(),
        name="password_reset"),
...

你应该学会阅读链接文档来找到答案。它说:

[…]您可以设置
AccessMixin
的任何参数,以自定义对未经授权用户的处理[…]


在下面,您可以找到重定向未授权用户的属性和方法。

您可以使用
{%if user.is\u authenticated%}
{%if user.is\u anonymous%}
直接将其放入模板中,无需修改视图:

{% if user.is_anonymous %}
# user is not logged in
...
{% else %}
# user is logged in
...
{% endif %}

有点复杂,你能解释一下代码是什么吗doing@HimanshuPoddar它似乎是基于,只是它检查了oposite案例^Ralf所说的。您还可以将重定向页面传递给
用户\u passes\u tests
,也许
index
将登录的用户重定向到哪里。你能给我指一下django文档吗?该文档说明了如何处理这些情况。我没有得到有效的表单方法,你能解释一下它在做什么吗?如果不是self.request.user.is#anonymous:#。。。在这里做点什么@himanshupodar我编辑了我的答案并包括了
userpassestimxin
当前如果用户试图访问重置页面,它会显示403错误页面。您能告诉我如何将用户重定向到主页,而不是403错误页面吗。在那之后,我将接受这个问题的答案。@Himanshupodar你应该学会阅读我在答案中链接的文档,因为在那里你可以找到你的答案;我编辑了我的答案。
{% if user.is_anonymous %}
# user is not logged in
...
{% else %}
# user is logged in
...
{% endif %}