質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.79%

Django:登録後現在のページにリダイレクトしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 130

score 7

前提・実現したいこと

Djangoの学習で名前・年齢・性別・部署を登録できるようになったのですが
登録後フォームを空白にして表示させたいのですが
現状入力フォーム自体が消えてしまっています。
空白の入力フォームを表示させるにはどうすればいいですか?

発生している問題・エラーメッセージ

登録前
https://gyazo.com/09422226c80ec5daf860b4000dba2227
登録後
https://gyazo.com/d33a40d19980d128098234ac4a411526

DBへは保存されています。
登録ボタンに関しては無視してください。

該当のソースコード

views.py

from django.urls import reverse
from django.http import HttpResponse, HttpResponseRedirect
from django.views.decorators.http import require_http_methods
from django.shortcuts import render
from django.template import loader
from .form import RegistrationForm

from .models import User

def index(request):
    return render(request, 'employee/index.html')

@require_http_methods(['GET', 'POST'])
def registration(request):
    if request.method == 'GET':
        params = {'employee_name': '','age': '',"sex": '','department': ''}
        context = {'form': RegistrationForm(initial=params)}
    else:
        form = RegistrationForm(request.POST)
        if form.is_valid():
            registration = User(
                employee_name=form.cleaned_data["employee_name"],
                age=form.cleaned_data["age"],
                sex=form.cleaned_data["sex"],
                department=form.cleaned_data["department"],
            )
            registration.save()
            return render(request, 'employee/registration.html')
            return HttpResponseRedirect(reverse('employee:registration'))

    template = loader.get_template('employee/registration.html')
    return HttpResponse(template.render(context, request))

def show(request):
    return render(request, 'employee/show.html')

def update(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)
form.py

from django import forms
from django.core import validators

list_department = [(0,""),(1,"管理"),(2,"システム開発"),(3,"営業")]
list_sex = [("start",""),(True,"男性"),(False,"女性")]

class RegistrationForm(forms.Form):
    employee_name = forms.CharField(label='担当者名',max_length=50)
    age = forms.IntegerField(label='年齢',validators=[validators.MinValueValidator(1), validators.MaxValueValidator(200),])
    sex = forms.ChoiceField(choices=list_sex,label='性別')
    department = forms.ChoiceField(choices=list_department,label='部署')

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.label_suffix=" "

    def clean(self):
        cleaned_data = super().clean()
        return cleaned_data

    def clean_employee_name(self):
        employee_name = self.cleaned_data['employee_name']
        return employee_name

    def clean_age(self):
        age = self.cleaned_data['age']
        return age

    def clean_sex(self):
        sex = self.cleaned_data['sex']
        return sex

    def clean_department(self):
        department = self.cleaned_data['department']
        return department
urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('show/', views.show, name='show'),
    path('<int:registration_id>/update/', views.update, name='update'),
    path('registration/', views.registration, name='registration'),
]
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'employee/reset.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'employee/style.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'employee/registration.css' %}">

<div class = top>
    <h1>登録</h1>

    {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

    <div class = form>
        <div class = registration-form>
            <form action="" method="POST">
                {% csrf_token %}
                {% for value in form %}
                    <div class = form-content>
                        <p>{{ value.label }}</p>
                        <p>{{ value }}{{ value.errors }}</p>
                    </div>
                {% endfor %}
                <button type="submit" class="btn">登録</button>
            </form>
        </div>
        <div class = move-btn>
            <div><a href="/employee/" class = btn>メニュー</a></div>
            <div><a href="/employee/show/" class = btn>登録</a></div>
        </div>
    </div>
</div>

補足情報(FW/ツールのバージョンなど)

Windows10
VitualStudioCode
Python 3.9.4
Django 3.2.3

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

これでどうでしょう

# views.py
def registration(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            registration = User(
                employee_name=form.cleaned_data["employee_name"],
                age=form.cleaned_data["age"],
                sex=form.cleaned_data["sex"],
                department=form.cleaned_data["department"],
            )
            registration.save()

    params = {'employee_name': '','age': '',"sex": '','department': ''}
    context = {'form': RegistrationForm(initial=params)}

    template = loader.get_template('employee/registration.html')
    return HttpResponse(template.render(context, request))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/06/03 09:16

    >>tatamyiwathyさん、attakeiさん
    回答ありがとうございます。また返信が遅くなり申し訳ありません。
    どうしてこうなったのか理由まで説明してくださり
    自分でもそういうことかと納得できました。ありがとうございます。
    該当部分削除したところDBには保存されましたが
    新たなエラーがでました。
    tatamyiwathyさんのコードですと
    保存後そのままエラーなく期待通りの動きを
    取ってくれたので今回はtatamyiwathyさんをベストアンサーにしたいと思います。
    お二人とも本当にありがとうございました。

    キャンセル

0

現状のview関数だと、「POSTリクエストでフォームのバリデーションが正しいとき」に、保存時の後にrenderでreturnしています。
renderだと、テンプレートを元にHTMLを生成して返しますが、この関数にフォームが含まれていないため、フォーム部分が生成されていません。

POSTの成功時はリダイレクトするのが望ましいですが、幸いなのかview関数内でreturnを連続で記載してて2個目がリダイレクトとなっています。
そのため、最初のリダイレクトを削除すると、

  1. POSTリクエストをする
  2. バリデーション成功時は、保存を行いリダイレクト
  3. リダイレクト先はGETになるため、フォームが表示される

となります。

@require_http_methods(['GET', 'POST'])
def registration(request):
    if request.method == 'GET':
        params = {'employee_name': '','age': '',"sex": '','department': ''}
        context = {'form': RegistrationForm(initial=params)}
    else:
        form = RegistrationForm(request.POST)
        if form.is_valid():
            registration = User(
                employee_name=form.cleaned_data["employee_name"],
                age=form.cleaned_data["age"],
                sex=form.cleaned_data["sex"],
                department=form.cleaned_data["department"],
            )
            registration.save()
-            return render(request, 'employee/registration.html')
            return HttpResponseRedirect(reverse('employee:registration'))

    template = loader.get_template('employee/registration.html')
    return HttpResponse(template.render(context, request))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る