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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Django

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

Python 3.x

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

Q&A

解決済

1回答

3455閲覧

django フォームを実装したい

yuudai

総合スコア65

Django

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

Python 3.x

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

0グッド

0クリップ

投稿2020/06/04 02:57

前提・実現したいこと

djangoでhtmlじょうのformに入力された情報をデータベースに保存するまでの一連の流れをできるようにしたいです。
エラー内容について調べるとタイプミスが原因だといわれているが自分の場合はタイプミスはないように思う。

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

ValueError: ModelForm has no model class specified.

該当のソースコード

views.py

from .forms import PlayerForm from django.shortcuts import render def makedata(request): if request.method == 'POST': form = PlayerForm(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() else: form = PlayerForm() return render(request, 'makedata.html', {'form': form})

forms.py

from django import forms from .models import Post class PlayerForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['player1'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player2'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player3'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player4'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player5'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player6'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player7'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player8'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player9'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player10'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player11'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player12'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player13'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player14'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player15'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player16'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player17'].widget.attrs({'placeholder':'選手名を入力してください',}) self.fields['player18'].widget.attrs({'placeholder':'選手名を入力してください',}) class Meta: model = Post fields = ['player1', 'player2', 'player3', 'player4', 'player5', 'player6', 'player7', 'player8', 'player9', 'player10', 'player11', 'player12', 'player13', 'player14', 'player15', 'player16', 'player17', 'player18']

models.py

from django.db import models class Post(models.Model): player1 = models.CharField(max_length=20) player2 = models.CharField(max_length=20) player3 = models.CharField(max_length=20) player4 = models.CharField(max_length=20) player5 = models.CharField(max_length=20) player6 = models.CharField(max_length=20) player7 = models.CharField(max_length=20) player8 = models.CharField(max_length=20) player9 = models.CharField(max_length=20) player10 = models.CharField(max_length=20) player11 = models.CharField(max_length=20) player12 = models.CharField(max_length=20) player13 = models.CharField(max_length=20) player14 = models.CharField(max_length=20) player15 = models.CharField(max_length=20) player16 = models.CharField(max_length=20) player17 = models.CharField(max_length=20) player18 = models.CharField(max_length=20)

makedata.html

<form action="{% url 'makedata' %}" method="POST"> <div class="popup" id="js-popup"> <div class="popup-inner"> <div class="close-btn" id="js-close-btn"><i class="fas fa-times"></i></div> <a href="#"> <div class="foo"> <div class="box_left"> <h1>先攻</h1> <table id="example" class="table table-striped table-bordered" cellspacing="0" > <thead> <tr> <th>打順</th> <th class="player">名前</th> <th>右・左打ち</th> <th>投手</th> </tr> </thead> <tbody> <tr> <td>1</td> <td class="player">{{ form.player1 }}</td> <td>2016/01/15</td> <td>Done</td> </tr> <tr> <td>2</td> <td class="player">{{ form.player2 }}</td> <td>2016/01/31</td> <td>Planned</td> </tr> <tr> <td>3</td> <td class="player">{{ form.player3 }}</td> <td>2016/01/23</td> <td>To Do</td> </tr> <tr> <td>4</td> <td class="player">{{ form.player4 }}</td> <td>2016/02/26</td> <td>Done</td> </tr> <tr> <td>5</td> <td class="player">{{ form.player5 }}</td> <td>2016/02/18</td> <td>Planned</td> </tr> <tr> <td>6</td> <td class="player">{{ form.player6 }}</td> <td>2016/03/17</td> <td>To Do</td> </tr> <tr> <td>7</td> <td class="player">{{ form.player7 }}</td> <td>2016/05/28</td> <td>Confirmed</td> </tr> <tr> <td>8</td> <td class="player">{{ form.player8 }}</td> <td>2016/04/19</td> <td>Offer</td> </tr> <tr> <td>9</td> <td class="player">{{ form.player9 }}</td> <td>2016/10/31</td> <td>Confirmed</td> </tr> </tbody> </table> </div> <div class="box_left"> <h1>後攻</h1> <table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%"> <thead> <tr> <th>打順</th> <th class="player">名前</th> <th>右・左打ち</th> <th>投手</th> </tr> </thead> <tbody> <tr> <td>1</td> <td class="player">{{ form.player10 }}</td> <td>2016/01/15</td> <td>Done</td> </tr> <tr> <td>2</td> <td class="player">{{ form.player11 }}</td> <td>2016/01/31</td> <td>Planned</td> </tr> <tr> <td>3</td> <td class="player">{{ form.player12 }}</td> <td>2016/01/23</td> <td>To Do</td> </tr> <tr> <td>4</td> <td class="player">{{ form.player13 }}</td> <td>2016/02/26</td> <td>Done</td> </tr> <tr> <td>5</td> <td class="player">{{ form.player14 }}</td> <td>2016/02/18</td> <td>Planned</td> </tr> <tr> <td>6</td> <td class="player">{{ form.player15 }}</td> <td>2016/03/17</td> <td>To Do</td> </tr> <tr> <td>7</td> <td class="player">{{ form.player16 }}</td> <td>2016/05/28</td> <td>Confirmed</td> </tr> <tr> <td>8</td> <td class="player">{{ form.player17 }}</td> <td>2016/04/19</td> <td>Offer</td> </tr> <tr> <td>9</td> <td class="player">{{ form.player18 }}</td> <td>2016/10/31</td> <td>Confirmed</td> </tr> </tbody> </table> </div> <button type="submit" value="試合開始">試合開始</button> </form> </div> </a> </div> <div class="black-background" id="js-black-bg"></div> </div> {% csrf_token %} </form>

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python

1class PlayerForm(forms.ModelForm): 2 3 def __init__(self, *args, **kwargs): 4 super().__init__(*args, **kwargs) 5 ・・・ 6 class Meta: 7 model = Post 8 fields = ['player1', ・・・, 'player18'] 9```Metaクラスが__init__関数内に入ってしまっています。なので、 10```Python 11class PlayerForm(forms.ModelForm): 12 13 def __init__(self, *args, **kwargs): 14 super().__init__(*args, **kwargs) 15 ・・・ 16 class Meta: 17 model = Post 18 fields = ['player1', ・・・, 'player18']

投稿2020/06/04 03:08

編集2020/06/04 03:12
ForestSeo

総合スコア2720

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

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

yuudai

2020/06/04 03:22

素早い回答ありがとうございます。このエラーは解決したのですが self.fields['player1'].widget.attrs({'placeholder':'選手名を入力してください',}) この一文でTypeError: 'dict' object is not callableと言うエラーが出ました。 辞書は呼び出せないということですがどのようにすれば改善されるのでしょうか?
yuudai

2020/06/04 03:33 編集

class PlayerForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields.values(): # placeholderにフィールドのラベルを入れる field.widget.attrs['選手名を入力してください'] = field.label このように書き換えることでエラーは出なくなったのですがplaceholderは表示されません。何が原因なのでしょうか?
ForestSeo

2020/06/04 03:35

for field in self.fields.values(): ⠀⠀⠀⠀field.widget.attrs['placeholder'] = '選手名を入力してください' だと思いますが。
yuudai

2020/06/04 04:11

何度も回答していただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問