2017-11-14 16 views
1

비밀번호 재설정 이메일을 수동으로 보내야 새로운 사용자를 만들 수 있습니다. 나는 here에 설명 된 단계를 따르고 드라이브 바이 HttpRequest (pwreset_request = HttpRequest())를 만들었지 만, PasswordResetView.as_view()(pwreset_request)을 호출하는 대신에 잘못된 CSRF 토큰 때문에 403이 반환됩니다.수동으로 비밀번호 재설정 이메일을 보내는 방법은 무엇입니까?

그럼에도 불구하고 (결과적으로 그 이메일을 받고 있음에도 불구하고) 페이지에 오류가 없으며 모든 것이 잘 작동합니다.

from django.http import HttpResponseForbidden, HttpResponse, HttpRequest 
from django.middleware.csrf import get_token 

@login_required 
@permission_required(["abonnenten.verlag_sachbearbeiter_fullaccess"]) 
def sachbearbeiter_create_or_edit(request, username=None): 
    mode = "create" if username is None else "edit" 

    if mode == "create": 
     user = None 
     sachbearbeiter = None 
    else: 
     user = get_object_or_404(User, username=username) 
     sachbearbeiter = user.sachbearbeiter 

     if user.is_superuser or user.is_staff: 
      raise PermissionDenied 

    user_form = UserForm(request.POST or None, instance=user) 
    sachbearbeiter_form = SachbearbeiterForm(request.POST or None, instance=sachbearbeiter) 

    if request.method == 'POST': 
     if mode == "create": 
      if user_form.is_valid() and sachbearbeiter_form.is_valid(): 
       user = user_form.save(commit=False) 
       user.email = user.username 
       user.save() 
       sachbearbeiter = sachbearbeiter_form.save(commit=False) 
       sachbearbeiter.user = user 
       sachbearbeiter.save() 

       # Manually send password reset mail 
       # TODO Fix this shit (403) 
       pwreset_request = HttpRequest() 
       pwreset_request.method = 'POST' 
       pwreset_request.META['HTTP_HOST'] = request.META['HTTP_HOST'] 
       pwreset_request.POST = {'email': user.email, 'csrfmiddlewaretoken': get_token(HttpRequest())} 
       PasswordResetView.as_view()(pwreset_request) 

       messages.success(request, 'Der Datensatz wurde erfolgreich gespeichert.') 
       return redirect('sachbearbeiter_edit', username=user.username) 
     elif mode == "edit": 
      if user_form.is_valid() and sachbearbeiter_form.is_valid(): 
       user = user_form.save(commit=False) 
       user.email = user.username 
       user.save() 
       sachbearbeiter_form.save() 
       messages.success(request, 'Der Datensatz wurde erfolgreich gespeichert.') 
       return redirect('sachbearbeiter_edit', username=user.username) 
     else: 
      raise ValueError("Variable `mode` must be 'create' or 'edit'") 

    return render(request, 
        'sachbearbeiter/edit_or_create.html', 
        {'mode': mode, 
        'user': user, 
        'user_form': user_form, 
        'sachbearbeiter_form': sachbearbeiter_form}) 

아이디어를 수정하는 방법은 무엇입니까?

+0

내가 그 사람을 도움이 생각하지 않지만, 여기 당신은 간다 :이 코드에 의해

# Manually send password reset mail # TODO Fix this shit (403) pwreset_request = HttpRequest() pwreset_request.method = 'POST' pwreset_request.META['HTTP_HOST'] = request.META['HTTP_HOST'] pwreset_request.POST = {'email': user.email, 'csrfmiddlewaretoken': get_token(HttpRequest())} PasswordResetView.as_view()(pwreset_request) 

:

그래서 아래의 모든 코드를 대체합니다. – Daniel

+0

lol 템플릿은 무엇이 필요합니까? 이것은 템플릿과 관련이 없으며 더 이상 쓸데없는 혼란으로 내 질문에 홍수를 내지 않을 것입니다. – Daniel

+0

다시 템플릿이나보기에는 문제가 없습니다. 'pwreset_request = HttpRequest()'에만 문제가 있습니다. 나는 이미'get_token (HttpRequest())'를 사용하지 않으려 고했다. – Daniel

답변

1

Request 개체를 수동으로 생성하고이보기에서 PasswordResetForm을 사용할 수있는 경우 암호 재설정보기를 호출하는 이유는 무엇입니까?

from django.contrib.auth.forms import PasswordResetForm 

reset_password_form = PasswordResetForm(data={'email': user.email}) 
if reset_password_form.is_valid(): 
    reset_password_form.save(request=request) # The save method will send the email 
+0

요청이 NoneType이기 때문에'reset_password_form.save()'에서 여전히 오류가 발생했습니다. 그것은 사이트 이름에 대한'request' 인스턴스를 전달하는 것에 의존하기 때문에 명백해 보입니다. 이 문제를 해결하려면'reset_password_form.save (request = request)'와 같은 매개 변수로 요청을 전달해야합니다. 감사. – Daniel

+0

죄송합니다. 위의 코드를'shell_plus'에서 직접 테스트 했으므로 여기에 요청하지 않아도됩니다. 수정 사항을 수락했습니다. –