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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1292閲覧

Django 掲示板作りのデータ取り出し

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/04/21 05:10

Djangoで掲示版を作っていたところ投稿内容がうまく表示されなくて困っています。Formで作成したデータは、管理画面で確認してモデルに入っているのですがhtmlに表示ができません。おそらく{% for answers in answer_list %}の部分がいけないと思われるのですが色々やってもうまくいきません。この場合のfor文の中身はどうすればいいのでしょうか?

python -----models.py----- class Diary(models.Model): user = models.ForeignKey(CustomUser, verbose_name='ユーザー', on_delete=models.PROTECT) title = models.CharField(verbose_name='タイトル', max_length=40) content = models.TextField(verbose_name='本文', blank=True, null=True) created_at = models.DateTimeField(verbose_name='作成日時', auto_now_add=True) updated_at = models.DateTimeField(verbose_name='更新日時', auto_now=True) class Meta: verbose_name_plural = 'Diary' def __str__(self): return self.title class Answer(models.Model): """投稿""" user = models.ForeignKey(CustomUser, verbose_name='ユーザー', on_delete=models.PROTECT) content = models.TextField(verbose_name='本文', blank=True, null=True) created_at = models.DateTimeField(verbose_name='作成日時', auto_now_add=True) updated_at = models.DateTimeField(verbose_name='更新日時', auto_now=True) class Meta: verbose_name_plural = 'Answer' def __str__(self): return self.content
python ----- views.py------ class DiaryDetailView(DetailView): model = Diary template_name = 'diary_detail.html' class AnView(CreateView): model = Answer fields = ('user', 'content') template_name = 'answer.html' def form_valid(self, form): diary_pk = self.kwargs['pk'] diary = get_object_or_404(Diary, pk=diary_pk) answer = form.save(commit=False) answer.target = diary answer.save() return redirect('ampapp:diary_detail', pk=diary_pk)
python      -------diary_detail.html------ {% for answers in answer_list %} <h1> 名前:{{ answers.user }}</h1> <h2>内容:{{ answers.content }}</h2>  {% endfor %}
python -----answer.html------ <form method="POST" enctype='multipart/form-data'> {% csrf_token %} <table class="table"> {{ form.as_table }} </table> <button class="btn btn-primary" type="submit">作成</button> </form>

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

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

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

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

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

guest

回答1

0

ベストアンサー

DiaryモデルとAnswerモデルに関連がないため、DiaryDetailViewでは、Answerの一覧を表示できません。

DiaryモデルとAnswerモデルに、1対多の関連を持たせたいのでしょうか?
そうであれば、下記フィールドをAnswerモデルに追加してください。

python

1class Answer(models.Model): 2 # snip 3 diary = models.ForeignKey(Diary, on_delete=models.PROTECT) 4 # on_deleteは目的に合わせて変更してください。

そうすれば、DiaryDetailViewのテンプレートで、詳細を表示するDiaryに関連するAnswerの一覧を下記の通り表示できます。なお、objectは、Djangoが追加したDiaryモデルインスタンスです。

html

1{% for answer in object.answer_set.all %} 2 {{ answer }} 3{% endfor %}

また、下記はAnswerモデルインスタンスに動的に属性を追加しているのみですが、何か意図があるのでしょうか?

python

1def form_valid(self, form): 2 # snip 3 answer.target = diary

投稿2020/04/21 09:03

hasami

総合スコア1277

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

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

退会済みユーザー

退会済みユーザー

2020/04/21 10:28

ご回答ありがとうございます。 answer.target = diaryは前の消し忘れです、すみません models.pyを編集後migrateを実行したところ以下のようなエラーがターミナル上で表示されました  django.db.utils.IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`war`.`#sql-16d4_52`, CONSTRAINT `ampapp_answer_diary_id_1e00d17e_fk_ampapp_diary_id` FOREIGN KEY (`diary_id`) REFERENCES `ampapp_diary` (`id`))') おそらくmigrationsの際に不整合なデータ(初期値3)を入れて外部キー制約に反していると指摘されていると思われるのですが初期値はどうすればいいのでしょうか? --以下migration時の要求 You are trying to add a non-nullable field 'diary' to answer without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows with a null value for this column) 2) Quit, and let me add a default in models.py Select an option: diary Please select a valid option: 1 Please enter the default value now, as valid Python The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now Type 'exit' to exit this prompt
hasami

2020/04/21 10:46

Please select a valid optionで入力した1を主キーにもつDiaryのインスタンスは存在するのでしょうか? 存在するDiaryインスタンスの手主キーの値を入力してみてください。
退会済みユーザー

退会済みユーザー

2020/04/21 15:05 編集

ご返信ありがとうございます。 これによってdiaryカラムによって紐づけられたことによってそれぞれのフォームを作った表示が複数表示されるようになりました。object.answer_set.allというイテラブルオブジェクトはどういったときに使うのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問