2016-06-27 4 views
1

나는 django-allauth를 사용하여 사용자가 자신의 계정을 삭제하거나 비활성화 할 수있는 최선의 방법을 알아 내려고하고 is_active 필드를 False로 설정해야한다고 가정하고 있습니다.사용자가 장고 allauth에서 계정을 삭제할 수있게 하시겠습니까?

내 솔루션 아래에 몇 가지 문제가 있습니다 : 1) 렌더링 된 확인란 필드 is_active는 "이 사용자를 활성으로 처리해야하는지 여부를 지정합니다. 계정을 삭제하지 말고 선택 취소하십시오."라는 텍스트를 표시합니다. 이 텍스트를 "이 계정을 삭제 하시겠습니까?"로 변경하려면 어떻게해야합니까?

업데이트 : 상자 선택을 취소하는 동안 is_active를 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> 

렌더링 : confirm delete

+1

일부 관할지 (즉, 적어도 모든 EU) 사용자는 계정을 비활성화하는 것뿐만 아니라 실제 * 삭제를 요청할 권리가 있습니다. 따라서 서비스에 따라 계정이 비활성화 또는 삭제되는지 여부를 명확하게 명시하고 실제 삭제를 수행 할 수있는 옵션을 제공하는 것이 좋습니다. – Bakuriu

+0

가져와 주셔서 감사합니다. 나는 User에 대한 삭제 방법에 대한 연구를해야 할 것이다. – bayman

답변

1

문제 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')) 

이는 ACCOUNT_LOGOUT_REDIRECT_URL를 통해 설정에서 설정 한 URL로 사용자를 전달합니다 로그 아웃 URL로 리디렉션합니다. 사용자의 계정이 비활성화되었으며 로그 아웃되었습니다.

+0

# 2에 대한 해결책은 작동하지만 문제 # 1에 대해 깨달았습니다. 확인란을 선택 취소하는 동안 is_active를 True로 설정하면 상자가 False로 설정되므로 다른 체크 박스 필드를 사용하여 양식의 유효성을 검사해야 할 수 있습니다. help.text에 "이 상자를 선택하여 삭제 하시겠습니까?"라는 메시지가 나타납니다. help.text show "귀하의 계정 삭제를 확인하려면이 상자를 선택 취소하십시오." – bayman

+0

사용자 정의 청소 방법을 사용하면 확인란 선택을 취소 할 수 있습니다. 위의 추가됩니다 :) –

관련 문제