業務改善 web開発 programming 旅行系記事多め。

【Django】リダイレクト先への引数の渡し方_ListViewの場合

djangoDjango

DjangoのViews.pyで、とある処理をした後に別のページ(関数)にリダイレクトさせることがあると思います。

上画像のように「チェックボタン」「削除ボタン」がクリックされた際に動く処理があり、最後に同ページにリダイレクトさせています。今回はさらに、「チェック」「削除」どちらのボタンがクリックされたのかを判別させるための引数もリダイレクト先に追加した場合について記載したいと思います。(リダイレクト先がListViewを使用したクラスベース関数であるという前提です。)

view.pyimportには以下を追加してください。

from django.urls import reverse #追加

まず、ボタンがクリックされた際に動く処理。

def daily_record(request):
    is_run = 'false'
    if request.method == 'POST':
        if 'delete' in request.POST:
            deleteID = request.POST.get('delete')
            record = daily.objects.get(id=deleteID)
            record.delete()
        elif 'done' in request.POST:
            today_date = datetime.date.today()
            yyyymmdd = today_date.strftime('%Y%m%d')

            deleteID = request.POST.get('done')
            daily_object = daily.objects.get(id=deleteID)
            daily_content = daily_object.content
            done.objects.create(content=daily_content, date_str=yyyymmdd)

            record = daily.objects.get(id=deleteID)
            record.delete()
            is_run = 'true'

    url = reverse('testtest:index_redirect', kwargs={'is_run': is_run})

    return redirect(url)

リダイレクト先に引数を渡す箇所をピンポイントで示すとこちらになります。

url = reverse('testtest:index_redirect', kwargs={'is_run': is_run})
return redirect(url)

reverse関数でリダイレクト先のurlを取得します。(testtestアプリ内urls.pyのurlpatternsでname=’index_redirect’と指定したurlを呼び出すという形です。)
kwargsには渡したい引数を記載しましょう。左側の‘is_run’はリダイレクト先で値を取得する際に識別するキーのようなもので、右側のis_runは値が格納された変数です。(ご存じの通りこの2つはそれぞれ違う名称で設定しても全然問題ありません)

リダイレクト先での引数の受け取り方。

def get_context_data(self, **kwargs):
      is_run = self.kwargs['is_run']

さらにこの値をtemplatesに反映させる場合は以下のようにcontext.updateに追加します。

context.update({
       'is_run': is_run,
       #その他省略
        })

urls.pyではこのようになります。

app_name = 'testtest'
urlpatterns = [
    path('<str:is_run>/', views.index_redirect, name='index_redirect'),
]

渡す値が文字列の場合はstr、数値の場合はintなど型を最初に指定しましょう。

コメント

タイトルとURLをコピーしました