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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

5691閲覧

外部キーで参照したテーブルのカラムの値が表示できません。。。

shohei0718

総合スコア17

Django

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

Python 3.x

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

0グッド

0クリップ

投稿2019/01/26 08:44

編集2019/01/26 09:26

前提

Python 3.7.1
Django version 2.1.5

実現したいこと

下記画像で、プルダウンで表示されているのは、外部キーで参照したテーブルのオブジェクトになっているが、

イメージ説明

下記の「山田太郎」のようにプルダウンで表示されるものをオブジェクトではなく、登録した顧客名にしたい。
つまり、customer.nameのようにしてカラムの値を抽出して、プルダウンに表示させたい。

イメージ説明

顧客名に関しては、別のページで登録・一覧表示を見ることができる状態です。

イメージ説明

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

外部キーは参照できているが、参照先のテーブル(今回の場合は、Customerテーブル)からnameカラムの値を抽出できていない

ソースコード

views

1def lesson_form(request): 2 if request.method == "POST": 3 form = LessonForm(request.POST) 4 if form.is_valid(): 5 lesson = form.save(commit=False) 6 lesson.price = lesson.lesson_time * PRICE_PER_HOUR 7 lesson.save() 8 return HttpResponseRedirect(reverse('lesson_index')) 9 else: 10 form = LessonForm() 11 return TemplateResponse(request, 'exam/lesson_form.html', {'form': form})

models

1from django.db import models 2from django.utils import timezone 3from datetime import datetime 4from django.core.validators import MaxValueValidator, MinValueValidator 5 6class Customer(models.Model): 7 Men = '男' 8 Women = '女' 9 GENDER = ( 10 (Men, '男'), 11 (Women, '女'), 12 ) 13 14 name = models.CharField('名前', max_length = 20) 15 gender = models.CharField( 16 '性別', 17 max_length = 1, 18 choices=GENDER, 19 ) 20 age = models.IntegerField('年齢') 21 22class Lesson(models.Model): 23 English = '英語' 24 Finance = 'ファイナンス' 25 Programing = 'プログラミング' 26 GENRE = ( 27 (English, '英語'), 28 (Finance, 'ファイナンス'), 29 (Programing, 'プログラミング'), 30 ) 31 32 customer = models.ForeignKey(Customer, verbose_name='顧客名', on_delete=models.PROTECT) 33 34 genre = models.CharField( 35 'ジャンル', 36 max_length = 255, 37 choices=GENRE, 38 default=English) 39 lesson_day = models.DateTimeField('受講日') 40 lesson_time = models.PositiveIntegerField( 41 '受講時間(h)', 42 default = 1, 43 validators=[ 44 MaxValueValidator(12), 45 MinValueValidator(1) 46 ] 47 ) 48 price = models.IntegerField('支払金額', null=True) 49 50 def __str__(self): 51 return self.customer

forms

1from django import forms 2from exam.models import Customer 3from exam.models import Lesson 4 5class LessonForm(forms.ModelForm): 6 class Meta: 7 model = Lesson 8 fields = ('customer', 'genre', 'lesson_day', 'lesson_time')

試したこと

modelsの下記の部分がおかしいのはないかと思い、第一引数のCustomerを色々触ってみましたが、
エラーで返ってきました。

models

1customer = models.ForeignKey(Customer, verbose_name='顧客名', on_delete=models.PROTECT)

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/01/27 09:52

django全然分かりませんが、Customerに__str__を追加したらうまく行くのではないでしょうか? > def __str__(self): > return self.name
shohei0718

2019/01/27 11:09

有難うございます!! 試してみたら、うまくいきました!!
guest

回答1

0

自己解決

modelsに下記内容を追記したら、うまく表示されました

def str(self):
return self.name

投稿2019/01/27 11:10

shohei0718

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問