2017-11-14 3 views
1

パスワードリセットメールを手動で送信して、新しいユーザーを作成する必要があります。私はhereと記載されている手順に従い、ドライブバイHttpRequest(pwreset_request = HttpRequest())を作成しましたが、無効なCSRFトークンがあるため、PasswordResetView.as_view()(pwreset_request)を呼び出すことに戻るのは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

を私は誰も助けないと思いますが、ここに行きます。 – Daniel

+0

笑テンプレートは何のために必要ですか?これはテンプレートとは関係がありませんし、私の質問にはもう役に立たない混乱はありません。 – Daniel

+0

また、テンプレートやビューに問題はありません。これは 'pwreset_request = HttpRequest()'のみの問題です。私はすでに 'get_token(HttpRequest())'を無駄にしようとしました。 – Daniel

答えて

1

Requestオブジェクトを手作業で作成し、このビューで使用されているPasswordResetFormだけを使用できる場合は、パスワードリセットビューを呼び出すのはなぜですか?

ので、下記のすべてのコードを置き換えます。このコードにより、

# 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) 

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

requestがNoneTypeなので、 'reset_password_form.save()'にはまだエラーがあります。サイト名の 'request'インスタンスが渡されることに依存しているので、明らかです。この修正は、 'reset_password_form.save(request = request)'のようにリクエストをパラメータとして渡すことです。ありがとう。 – Daniel

+0

申し訳ありませんが、上記のコードを 'shell_plus'で直接テストしましたので、ここでリクエストする必要はないかもしれません。あなたの編集を受け入れました。 –

関連する問題