python - 如何允许用户删除 django allauth 中的帐户?

标签 python django django-allauth

我正在尝试找出允许用户使用 django-allauth 删除或停用其帐户的最佳方法,并且我假设我需要将 is_active 字段设置为 False。

我的以下解决方案有一些问题: 1) 呈现的复选框字段 is_active 显示文本“指定此用户是否应被视为事件用户。取消选择此选项而不是删除帐户。”如何将此文本更改为“如果您确定要删除此帐户,请选中此框。”?

更新:刚刚意识到选中该框将 is_active 设置为 True,而取消选中该框将其设置为 False,所以也许我可能需要使用不同的字段来验证表单?

2) 如何在提交时注销用户?

表单.py:

class DeactivateUserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['is_active']

views.py:

login_required(login_url='/accounts/login/')
def deactivate_user_view(request):  
    pk = request.user.id
    user = User.objects.get(pk=pk)
    user_form = DeactivateUserForm(instance=user)
    if request.user.is_authenticated() and request.user.id == user.id:
        if request.method == "POST":
            user_form = DeactivateUserForm(request.POST, instance=user)
            if user_form.is_valid():
                deactivate_user = user_form.save(commit=False)
                user.is_active = False
                deactivate_user.save()
        return render(request, "account/userprofile_del.html", {
            "user_form": user_form,
        })
    else:
        raise PermissionDenied

userprofile_del.html:

<h2>Delete your account</h2>
<hr>
<form action="." method="POST" class="padding">{% csrf_token %}
    {{ user_form.as_p}}
    <button class="btn btn-primary" type="submit" name="action">{% trans "Confirm" %}</button>
</form>

渲染: confirm delete

最佳答案

希望为停用和删除用户的 View 提供潜在的答案。

# forms.py

from django import forms

class UserDeactivateForm(forms.Form):
    """
    Simple form that provides a checkbox that signals deactivation.
    """
    deactivate = forms.BooleanField(required=True)


class UserDeleteForm(forms.Form):
    """
    Simple form that provides a checkbox that signals deletion.
    """
    delete = forms.BooleanField(required=True)
# views.py

# You could make this DRYer, but sometimes repeating yourself
# for explicitness makes sense.

from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib import messages
from django.contrib.auth import logout
from django.shortcuts import redirect, render
from django.urls import reverse
from django.views.generic import View

from .forms import UserDeactivateForm, UserDeleteForm

class UserDeactivateView(LoginRequiredMixin, View):
    """
    Deactivates the currently signed-in user by setting is_active to False.
    """
    def get(self, request, *args, **kwargs):
        form = UserDeactivateForm()
        return render(request, 'users/user_deactivation.html', {'form': form})

    def post(self, request, *args, **kwargs):
        form = UserDeactivateForm(request.POST)
        # Form will be valid if checkbox is checked.
        if form.is_valid():
            # Make user inactive and save to database.
            request.user.is_active = False
            request.user.save()
            # Log user out.
            logout(request)
            # Give them a success message.
            messages.success(request, 'Account successfully deactivated')
            # Redirect to home page.
            return redirect(reverse('home'))
        return render(request, 'users/user_deactivation.html', {'form': form})


class UserDeleteView(LoginRequiredMixin, View):
    """
    Deletes the currently signed-in user and all associated data.
    """
    def get(self, request, *args, **kwargs):
        form = UserDeleteForm()
        return render(request, 'users/user_deletion.html', {'form': form})

    def post(self, request, *args, **kwargs):
        form = UserDeleteForm(request.POST)
        # Form will be valid if checkbox is checked.
        if form.is_valid():
            user = request.user
            # Logout before we delete. This will make request.user
            # unavailable (or actually, it points to AnonymousUser).
            logout(request)
            # Delete user (and any associated ForeignKeys, according to
            # on_delete parameters).
            user.delete()
            messages.success(request, 'Account successfully deleted')
            return redirect(reverse('home'))
        return render(request, 'users/user_deletion.html', {'form': form})

然后,您需要为每个模板和 URL 路由创建模板,但这些应该非常简单。

关于python - 如何允许用户删除 django allauth 中的帐户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38047408/

相关文章:

django-allauth 没有名为 'django.core.email' 的模块

python - 无法挤压 dim[1],期望维度为 1,结果为 2

python - 使用序列化程序从 URL 保存图像

python - 从数据框列名称中删除句点 (.)

django - 如何在托管在 Heroku 上的 Django 项目中使用 Werkzeug 交互式回溯调试器?

python - 从 blob 音频 django 创建一个 wav 文件

python - Django Allauth 在注册时执行 request.POST,但没有重定向或发送电子邮件?

Django-allauth:用户注销的成功 URL 的 PasswordChangeView 覆盖导致错误

python - Python 中的 ProcessPoolExecutor 和 Lock

python - 通过分箱列访问 pandas 中的行