🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2219閲覧

【Django3_CreateView】新規作成画面で、登録したい情報が登録できない。

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/02/25 05:55

こんにちは。
DjangoのCreateViewを活用したデータの登録ができずに悩んでいます。
ご助力していただけないでしょうか?

(アプリ名はmanagerで作成しております。)

前提・実現したいこと

ページに社員一覧ページ・詳細ページ・新規登録ページを作成しています。

新規登録画面より情報を登録したのち、
登録した社員の詳細ページに自動遷移し、登録内容が確認できるようにしたいです。

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

エラーMsgはでていませんが、現在新規登録画面より情報を登録すると、
ターミナルに長い文字列が出力されます。

また、新規登録画面より登録ボタンをおした時の挙動が、
画面そのままで、入力した情報がまっさらとなっております。

[25/Feb/2021 14:18:44] "GET /create/?csrfmiddlewaretoken=36hGw9JCcKcOoPhGSckCLiZLyj5dwul15L7QeVNQKnF3K9FA2ywTsw49edlqgkSl&no=7789&name=%E6%BB%9D%E6%B2%A2%E3%80%80%E5%8B%9D&kana=%E3%81%9F%E3%81%8D%E3%81%96%E3%82%8F%E3%80%80%E3%81%BE%E3%81%95%E3%82%8B&b_day=1989-01-24&tel=090-1145-7890&a_id=takizawa_m%40gmail.com&a_pass=Tg%27i%2Bhhh&remarks= HTTP/1.1" 200 1598

該当のソースコード

# models.py class Employee_inf(models.Model): no = models.CharField( max_length=4, primary_key=True, verbose_name="社員番号", ) name = models.CharField( max_length=10, verbose_name="名前", ) # 省略 def get_absolute_url(self): return reverse("detail", args={self.pk}) def __str__(self): return self.name class Meta: verbose_name_plural = "社員情報"

python

1# manager > views.py 2from django.views.generic.edit import CreateView 3 4# 新規作成 5class Create(CreateView): 6 model = Employee_inf 7 fields = ["no", "name", "kana", "b_day", "tel", "a_id", "a_pass", "remarks"] 8

python

1# manager > templates > manager > employee_inf_form.html 2{% extends 'manager/base.html' %} 3 4{% block main %} 5 6 <h1>新規作成</h1> 7 <form method="Employee_inf"> 8 {% csrf_token %} 9 {{ form.as_p }} 10 <input type="submit" value="登録" /> 11 </form> 12 13{% endblock main %}

python

1# manager > urls.py 2from django.urls import path 3from . import views 4 5urlpatterns = [ 6 path("create/", views.Create.as_view(), name="create"), # 新規作成URL 7 path('employee/', views.Index.as_view(), name="employee"), 8 path("detail/<pk>/", views.Detail.as_view(), name="detail"), 9] 10

試したこと

employee_inf_form.htmlのform methodの部分を変更しましたが、うまくいきませんでした。

新規作成画面は想定通りできていたので、情報を送る仕組みがうまくいっていないのかなと思っています。
おそらくmodels.pyの記述がよくないのかと思っていますが、どのように変更すればいいのか(調べてみましたが、)わかりませんでした。

参照先

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

Django 3.1.7
Python 3.9.1
SQLite3

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

hasami様のご回答の通り編集したところ、
「NameError at /create/」が画面上に表示され、
ターミナル上では、

python

1NameError: name 'reverse' is not defined

と表示されました。

確認したところ、
models.pyでの関数定義が失敗していたので、
こちらを修正して問題解決しました。

python

1 def get_absolute_url(self): 2 return reverse("detail", args={self.pk})

となっていたところを

python

1 def get_absolute_url(self): 2 return reverse_lazy("detail", args={self.pk})

に修正しました。

投稿2021/02/25 06:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasami

2021/02/25 06:48

get_absolute_urlメソッドで使用するのであれば、reverseで良いと思います。 下記がビューに記述されていないのが原因ではないでしょうか。 from django.urls import reverse reverse関数とreverse_lazy関数の機能は、URLの逆引きですが、reverse_lazy関数はURLの名前解決が できない段階(URLConfがロードされていない段階)で、遅延評価させるために使用します。 ※まぁ、結果が一緒なので、reverse、reverse_lazyのどちらでもいいのですが・・・。 class FooView(FormView): success_url = reverse_lazy(...) # reverse_lazyでないとダメ def get_success_url(self, ...): return reverse(...) # reverseでOK https://docs.djangoproject.com/en/3.1/ref/urlresolvers/#reverse-lazy
退会済みユーザー

退会済みユーザー

2021/02/25 07:07

おっしゃる通り、 from django.urls import reverse をしていたにもかかわらず、 return reverse_lazy("detail", args={self.pk}) と記載しておりました。 ご指摘までしていただいて、ありがとうございます。 とても助かっています。
guest

0

ベストアンサー

下記のようにしたらどうなりますか。

html

1<!-- employee_inf_form.html --> 2<!-- <form method="Employee_inf"> --> 3<form method="post"> 4 {% csrf_token %} 5 {{ form.as_p }} 6 <input type="submit" value="登録" /> 7</form>

投稿2021/02/25 06:24

hasami

総合スコア1277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/25 06:31

ありがとうございます。 form methodの部分をpostに変更したら全身しました。 エラーはでてしまったのですが、 models.pyで記述する部分にミスがあったので、そちらを修正することで解決しました。 ありがとうございます。 とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問