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

Python 如何允许用户删除django allauth中的帐户?,python,django,django-allauth,Python,Django,Django Allauth,我正在试图找出最好的方法,允许用户使用django allauth删除或停用他们的帐户,我假设我需要将is_active字段设置为False 我下面的解决方案有几个问题: 1) “呈现的复选框”字段处于活动状态,显示文本“指定是否应将此用户视为活动用户。取消选择此复选框,而不是删除帐户”。如何将此文本更改为“如果确实要删除此帐户,请选中此框” 更新:刚刚意识到,选中框集将被激活为True,而取消选中框集将被设置为False,所以我可能需要使用其他字段来验证表单 2) 如何在提交时注销用户 for

我正在试图找出最好的方法,允许用户使用django allauth删除或停用他们的帐户,我假设我需要将is_active字段设置为False

我下面的解决方案有几个问题: 1) “呈现的复选框”字段处于活动状态,显示文本“指定是否应将此用户视为活动用户。取消选择此复选框,而不是删除帐户”。如何将此文本更改为“如果确实要删除此帐户,请选中此框”

更新:刚刚意识到,选中框集将被激活为True,而取消选中框集将被设置为False,所以我可能需要使用其他字段来验证表单

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

forms.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>
删除您的帐户

{%csrf_令牌%} {{user_form.as_p} {%trans“确认”%}
呈现:

对于问题1,覆盖此字段的帮助文本属性;您可以在ModelForm的init方法中实现这一点

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

    def __init__(self, *args, **kwargs):
        super(DeactivateUserForm, self).__init__(*args, **kwargs)
        self.fields['is_active'].help_text = "Check this box if you are sure you want to delete this account."

    def clean_is_active(self):  
        # Reverses true/false for your form prior to validation
        #
        # You can also raise a ValidationError here if you receive 
        # a value you don't want, to prevent the form's is_valid 
        # method from return true if, say, the user hasn't chosen 
        # to deactivate their account
        is_active = not(self.cleaned_data["is_active"])
        return is_active
对于问题2,您可能需要禁用allauth中间层注销页面。在您的设置中:

ACCOUNT_LOGOUT_ON_GET = True
并重定向到视图逻辑中的注销页面

from django.shortcuts import HttpResponseRedirect
from django.core.urlresolvers import reverse_lazy

    # ... in your view
    if user_form.is_valid():
        deactivate_user = user_form.save(commit=False)
        user.is_active = False
        deactivate_user.save()
        return HttpResponseRedirect(reverse_lazy('account_logout')) 

这将重定向到注销url,然后通过帐户\注销\重定向\ url将用户转发到设置中设置的url。您的用户帐户现在已停用,并且已注销。

希望为视图提供一个可能的答案,以停用和删除用户

#forms.py
来自django导入表单
类UserDeactivateForm(forms.Form):
"""
提供一个复选框的简单表单,该复选框表示停用。
"""
deactivate=forms.BooleanField(必需=True)
类UserDeleteForm(forms.Form):
"""
提供一个复选框的简单表单,该复选框表示删除。
"""
delete=forms.BooleanField(必需=True)
#views.py
#你可以做这个干衣机,但有时也会重复你自己
#因为清晰是有意义的。
从django.contrib.auth.mixins导入登录名RequiredMixin
从django.contrib导入消息
从django.contrib.auth导入注销
从django.shortcuts导入重定向,渲染
从django.url反向导入
从django.views.generic导入视图
从.forms导入UserDeactivateForm,UserDeleteForm
类UserDeactivateView(LoginRequiredMixin,视图):
"""
通过将is_active设置为False来停用当前登录的用户。
"""
def get(自我、请求、*args、**kwargs):
form=UserDeactivateForm()
返回呈现(请求'users/user_deactivation.html',{'form':form})
def post(自我、请求、*args、**kwargs):
form=UserDeactivateForm(request.POST)
#如果选中复选框,则表单将有效。
如果form.is_有效():
#使用户处于非活动状态并保存到数据库。
request.user.is_active=False
request.user.save()
#注销用户。
注销(请求)
#给他们一个成功的信息。
messages.success(请求“帐户已成功停用”)
#重定向到主页。
返回重定向(反向('home'))
返回呈现(请求'users/user_deactivation.html',{'form':form})
类UserDeleteView(LoginRequiredMixin,视图):
"""
删除当前登录的用户和所有关联数据。
"""
def get(自我、请求、*args、**kwargs):
form=UserDeleteForm()
返回呈现(请求'users/user_deletation.html',{'form':form})
def post(自我、请求、*args、**kwargs):
form=UserDeleteForm(request.POST)
#如果选中复选框,则表单将有效。
如果form.is_有效():
user=request.user
#在删除之前注销。这将生成request.user
#不可用(或者实际上,它指向匿名用户)。
注销(请求)
#删除用户(以及任何相关的外键,根据
#打开(删除参数)。
user.delete()
messages.success(请求“帐户已成功删除”)
返回重定向(反向('home'))
返回呈现(请求'users/user_deletation.html',{'form':form})

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

您对#2的解决方案可行,但我刚刚意识到,对于问题#1,选中框集将为“活动”为“真”,而取消选中框集将其设置为“假”,因此,如果help.text显示“Check this box to delete”,我可能需要使用不同的复选框字段来验证表单?我不希望有帮助。文本显示“取消选中此框以确认删除您的帐户”自定义清理方法将允许您取消复选框选择。请注意,在某些司法管辖区(即,至少所有欧盟国家),用户有权要求真正删除其账户,而不仅仅是停用账户。因此,根据您的服务,最好清楚地说明帐户是被停用还是被删除,并提供一个选项来执行真正的删除。谢谢您提出这个问题。我必须对用户的删除方法做一些研究。