web-dev-qa-db-ja.com

Django HttpResponseRedirectをパラメーター付きのURLに返す

私のプロジェクトでは、パラメータを含むURLにユーザーをリダイレクトする必要がある状況があります(urls.pyで次のように宣言されています:

url(r'^notamember/(?P<classname>\w+)/$', 
                           notamember,
                           name='notamember'),)

リターンHttpResponseRedirectにそのパラメーターを配置するにはどうすればよいですか? return HttpResponseRedirect( '/ classroom/notamember/classname')、とにかく、これは愚かです、私は知っています、「classmane」をパラメーターとして考えることはできません。明確にするために、私の見解は次のとおりです。

def leave_classroom(request,classname):
theclass = Classroom.objects.get(classname = classname)
u = Membership.objects.filter(classroom=theclass).get(member = request.user).delete()
return HttpResponseRedirect('/classroom/notamember/theclass/')

そのURLに変数「theclass」を含めるにはどうすればよいですか?どうもありがとう!

30
dana

これを試して:

return HttpResponseRedirect('/classroom/notamember/%s/' % classname)

編集:

これは確かに優れています(ダニエルローズマンの答え):

from Django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)
43
adamk

これは複雑ではありません。 HttpResponseRedirectの引数は単なる文字列なので、文字列を構築するための通常の規則がここに適用されます。ただし、文字列ではなくClassRoomオブジェクトであるため、そこにtheclass変数が必要だとは思わない。おそらく、代わりにclassnameが必要です。ここでadamkはあなたに正しい答えを与えました。

ただし、文字列だけを使用できると言ったので、実際に行うべきことはreverse関数を使用することです。これは、後でURL構造を変更することを決定する可能性があり、URL文字列をハードコーディングした各場所をコードで確認するのではなく、1つの場所、つまりURLで定義したことに依存する必要があるためです。 pyファイル。したがって、次のようなことを行う必要があります。

from Django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)
51
Daniel Roseman

実際、ショートカットredirectはビュー名とモデル(get_absolute_url定義済み)名前も。

from Django.shortcuts import redirect

return redirect(leave_classroom)
4
Lakshman Prasad

すべてが機能していないように見える場合は、リターンレンダリングを使用し、誰かがページを更新した場合にそれがポストリクエストであるかどうかを確認します

if request.POST:
    message = "Thank you."
    return render(request, 'index.html', locals())
return HttpResponseRedirect('/')

Local()は、テンプレートでパラメーターにアクセスできるようにします

0
lilhamad

同じURLに送信する場合は、次を使用してパラメーターを渡すことができます。

 template_name = '/classroom/notamember.html'

return render(
                request,
                self.template_name,
                {'classname': 'classname', 'secondvariable': 'variable' }
            )
0
Haris Np