【问题标题】:Can someone suggest how to implement custom Django PasswordResetView? [closed]有人可以建议如何实现自定义 Django PasswordResetView? [关闭]
【发布时间】:2019-07-12 15:10:48
【问题描述】:

我只想将密码重置链接发送到确认的电子邮件地址。用户还可以通过搜索用户名或电子邮件地址来请求密码重置链接,这在默认 django 中不可用。很多天以来,我一直在尝试和编辑默认的 django 密码重置视图和表单。但不为我工作。

【问题讨论】:

  • 你需要展示你做了什么以及你遇到的错误。
  • 自定义密码重置视图的官方方法是什么。这样用户可以通过用户名或电子邮件搜索帐户以发送密码重置链接。

标签: python django web django-rest-framework web-site-project


【解决方案1】:

您可以扩展 PasswordResetView 从 rest_auth.views 并在其中做更多的逻辑 如示例

from rest_auth.views import PasswordChangeView, PasswordResetView, PasswordResetConfirmView
sensitive_post_parameters_m = method_decorator(
    sensitive_post_parameters(
        'password', 'old_password', 'new_password1', 'new_password2'
    )
)

class PasswordResetViewNew(PasswordResetView):
    def post(self, request, *args, **kwargs):
        email = request.data.get('email')
        try:
            if User.objects.get(email=email).active:

                return super(PasswordResetViewNew, self).post(request, *args, **kwargs)
        except:
            # this for if the email is not in the db of the system
            return super(PasswordResetViewNew, self).post(request, *args, **kwargs)



在网址中

    path('password/reset/', PasswordResetViewNew.as_view()),

编辑回答“如何通过用户名搜索发送密码重置链接”

PasswordResetView 的默认序列化程序包含

email = serializers.EmailField()

这意味着端点将不接受除电子邮件以外的任何东西 所以我们会做一些技巧让它接受字符,这样我们就可以向它发送用户名

首先我们将扩展 来自 rest_auth.serializers 的 PasswordResetSerializer 并做一些维护

from rest_auth.serializers import PasswordResetSerializer
from django.conf import settings
from django.contrib.auth.forms import PasswordResetForm

class TestSerializer(PasswordResetSerializer):
    email = serializers.CharField()
    # here changed the email to accept any chars
    reset_form = PasswordResetForm()

    def validate_email(self, value):
        #here we will trick it be make email really have the email of the username entered

        mutable = self.initial_data
        self.initial_data._mutable = True
        self.initial_data['email'] = User.objects.get(username=self.initial_data.get('email'))
        # don't forget to handle exception for username that not in db
        self.initial_data._mutable = mutable
        return super(TestSerializer, self).validate_email(value)

并且像这样在我们的视图中进行一些更改

from django.utils.translation import gettext_lazy as _
#don't forget to import PasswordResetView, TestSerializer

class PasswordResetViewNew(PasswordResetView):
    serializer_class = TestSerializer
    # here we changed the default serializer to our new serializer
    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.data['email'] = User.objects.get(username=serializer.data.get('email'))
        # here we trick it again and change the email with the email for the username entered
        serializer.save()
        # Return the success message with OK HTTP status
        return Response(
            {"detail": _("Password reset e-mail has been sent.")},
            status=status.HTTP_200_OK
        )

【讨论】:

  • 感谢您的帮助。我一定会试试这个。再次感谢您让工作变得轻松
  • 不客气,我已使用此代码返回特定的 JSON 响应,所以我认为您可以在 post 方法中添加逻辑,然后调用 super
  • 一个问题。如何通过用户名搜索发送密码重置链接。
  • 我将对完整案例代码的答案添加编辑
  • 完成,如果它对你有用,它对我有用,如果不是,请接受答案,你可以告诉我你得到了什么,以便我可以帮助你
猜你喜欢
  • 1970-01-01
  • 2018-09-22
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
相关资源
最近更新 更多