3

ログインとログアウトには、django.contrib.auth.views で Django の組み込みビューを使用します。ログイン/ログアウト ビューに「次の」パラメーターを渡すことができるため、ユーザーを前のページにリダイレクトするのは非常に簡単です。彼らはうまくいきます。

登録のために同様の機能を実現したい場合、いくつかの問題があります。Django には組み込みの登録ビューがないようです。だから私は「モデル=ユーザー」でCreateViewを使用しています。コードは次のとおりです。

#views.py

class Registration(CreateView):
    template_name='accounts/registration.html'
    model=User

    #Overwrite form_valid() to log this new user in after his successful registartion
    def form_valid(self, form):
        validation=super(Registration, self).form_valid(form)

        username=form.cleaned_data['username']
        password=form.cleaned_data['password2']
        user=authenticate(username=username, password=password)
        login(self.request, user)

        return validation

現在、組み込みのログイン/ログアウト ビューのような「次の」パラメーターはありません。次に、登録後に新しいユーザーを前のページにリダイレクトするにはどうすればよいですか?

私は次の方法を試しました:

ステップ 1: 登録ビューをトリガーするテンプレートから、GET メソッドを介して「次の」パラメーターを渡します。

<a href="{% url 'accounts:Registration' %}?next={{request.path}}">Registration</a>

ちなみに、登録に関するURLは以下の通りです。

#accounts/urls.py

urlpatterns = patterns('',
    # Others
    url(r'^registration/$', views.Registration.as_view(), name='registration'),
)

ステップ 2: get_context_data() および get_success_url() メソッドを上書きし、独自の「次の」パラメーターを構築しようとします。

#views.py

    class Registration(CreateView):

        # other codes as above

        def get_context_data(self, **kwargs):
              context=super(Registration, self).get_context_data(**kwargs)
              context[next]=self.request.GET['next']
              return context

        def get_success_url(self):
              redirect_to=self.request.POST['next']
              return redirect_to

ステップ 3: 私のテンプレートでは、次の値を保持する「隠し」入力フィールドを追加します。

# accounts/registration.html

<form method="post" action="{% url 'accounts:registration' %}" > {% csrf_token %}
    <p>
    {{form.as_p}}
    </p>
    <input type="submit" value="Regsitarte" /> 
    <input type="hidden" name="next" value={{next}} /> 
</form>

この方法は、ユーザーが登録手続き中に間違いを犯していない場合にのみ正常に機能します。たとえば、ユーザーが既存のユーザー名を POST した場合、または電子メール アドレスの形式が無効な場合、このメソッドは「next」パラメーターに関するエラーを報告します。

登録後にユーザーをリダイレクトする方法を誰かに教えてもらえますか? または、この機能を実現するためにコードを変更できますか? 新しいビューをゼロから作成する代わりに、Django の組み込みのクラスベースのジェネリック ビューを使用したいと考えています。

4

1 に答える 1

2

HTML フォームaction属性を空白のままにすると、現在のページの URL、GETクエリ パラメータ、およびすべてがデフォルトになります。

フォームを変更して隠しフィールドを削除し、アクションを削除すると、正常に機能するはずです。

<form method="post">
    <p>
    {{form.as_p}}
    </p>
    <input type="submit" value="Regsitarte" /> 
</form>
于 2015-03-16T23:05:19.350 に答える