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

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

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

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

Python 3.x

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

Python

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

Q&A

0回答

1447閲覧

DjangoのModelFormを利用したフォーム作成でForeignKeyで参照したフィールドを指定する方法

ttmone_

総合スコア6

Django

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

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2019/08/20 21:36

前提・実現したいこと

Djangoチュートリアルの投票アプリケーション(polls)を改良する形でアプリケーションを作っています。ModelFormを利用してフォームを作っているのですが、**Foreign Keyで連携したデータベースのフィールドをどのように表示させればよいのかわかりません。**現状のコード、だとForegin Keyで連携したデータベースのフィールドを含むすべてのフィールドが表示できていますが、ユーザーに変更されたくない値まで表示させてしまっています。

もしくは、

python

1fields = '__all__'

ですべてのフィールドを取り出した場合は、HTMLファイルでどのように表示させるのが良いのでしょうか。

取り出したいフィールド(カラム?)は

  • question_text
  • pub_date
  • question_deadline
  • choice_text
  • choice_image

該当のソースコード

python

1forms.py 2 3from django import forms 4from .models import Question, Choice 5 6 7class QuestionCreateForm(forms.ModelForm): 8 9 def __init__(self, *args, **kwargs): 10 super().__init__(*args, **kwargs) 11 12 class Meta: 13 model = Question 14 fields = '__all__' 15 16 17ChoiceFormset = forms.inlineformset_factory( 18 Question, Choice, fields='__all__', 19 extra=2, max_num=5, can_delete=False 20) 21

python

1models.py 2 3mport datetime, os 4 5from django.db import models 6from django.utils import timezone 7 8from mysite.settings import BASE_DIR 9 10# Create your models here. 11 12 13class Question(models.Model): 14 question_text = models.CharField(max_length=200) 15 pub_date = models.DateTimeField('date published') 16 question_deadline = models.DateTimeField(default=timezone.now() + timezone.timedelta(days=1)) 17 total_votes = models.IntegerField(default=0) 18 19 def __str__(self): 20 return self.question_text 21 22 def was_published_recently(self): 23 now = timezone.now() 24 return now - datetime.timedelta(days=1) <= self.pub_date <= now 25 was_published_recently.admin_order_field = 'pub_date' 26 was_published_recently.boolean = True 27 was_published_recently.short_description = 'Published recently?' 28 29 30class Choice(models.Model): 31 question = models.ForeignKey(Question, on_delete=models.CASCADE) 32 choice_text = models.CharField(max_length=200) 33 choice_image = models.ImageField(upload_to='polls', default=os.path.join(BASE_DIR, '/polls/default_icon.jpg')) 34 votes = models.IntegerField(default=0) 35 36 def __str__(self): 37 return self.choice_text 38

html

1new.html 2 3{% extends 'polls/base.html' %} 4 5{% block content %} 6<form action="{% url 'polls:add_question' %}" method="post"> 7 <h2>記事</h2> 8 {{ form.as_p }} 9 10 <h2>添付ファイル</h2> 11 {{ formset.management_form }} 12 {% for file_form in formset %} 13 {{ file_form.as_p }} 14 <hr> 15 {% endfor %} 16 17 {% csrf_token %} 18 <button type="submit" class="btn btn-primary">送信</button> 19</form> 20 21{% endblock %}

python

1views.py 2 3... 4 5def add_question(request): 6 form = QuestionCreateForm(request.POST or None) 7 context = {'form': form} 8 if request.method == 'POST' and form.is_valid(): 9 question = form.save(commit=False) 10 formset = ChoiceFormset(request.POST, files=request.FILES, instance=question) 11 if formset.is_valid(): 12 question.save() 13 formset.save() 14 return redirect('polls:index') 15 16 else: 17 context['formset'] = formset 18 19 else: 20 context['formset'] = ChoiceFormset() 21 22 return render(request, 'polls/new.html', context)

実際に表示されるフォーム
イメージ説明

試したこと

fieldsを表示させたいフィールドだけにしてみましたがForegin Keyで連携させているフィールドを指定するとエラーが出ます。

python

1forms.py 2 3from django import forms 4from .models import Question, Choice 5 6 7class QuestionCreateForm(forms.ModelForm): 8 9 def __init__(self, *args, **kwargs): 10 super().__init__(*args, **kwargs) 11 12 class Meta: 13 model = Question 14 fields = ('question_text', 'pub_date', 'question_deadline', 'choice_text', 'choice_image') 15 16 17ChoiceFormset = forms.inlineformset_factory( 18 Question, Choice, fields='__all__', 19 extra=2, max_num=5, can_delete=False 20) 21

エラーメッセージ

(venv) ttmone:mysite gaku$ python manage.py runserver Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). August 21, 2019 - 06:03:07 Django version 2.2.4, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. Not Found: / [21/Aug/2019 06:03:25] "GET / HTTP/1.1" 404 2153 [21/Aug/2019 06:03:33] "GET /polls/ HTTP/1.1" 200 976 [21/Aug/2019 06:03:33] "GET /static/polls/style.css HTTP/1.1" 304 0 [21/Aug/2019 06:03:36] "GET /polls/add/ HTTP/1.1" 200 3292 ^C(venv) ttmone:mysite gaku$ python manage.py runserver Watching for file changes with StatReloader Performing system checks... Exception in thread django-main-thread: Traceback (most recent call last): File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner self.run() File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run self._target(*self._args, **self._kwargs) File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/utils/autoreload.py", line 54, in wrapper fn(*args, **kwargs) File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 117, in inner_run self.check(display_num_errors=True) File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/core/management/base.py", line 390, in check include_deployment_checks=include_deployment_checks, File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/core/management/base.py", line 377, in _run_checks return checks.run_checks(**kwargs) File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/core/checks/registry.py", line 72, in run_checks new_errors = check(app_configs=app_configs) File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/core/checks/urls.py", line 40, in check_url_namespaces_unique all_namespaces = _load_all_namespaces(resolver) File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/core/checks/urls.py", line 57, in _load_all_namespaces url_patterns = getattr(resolver, 'url_patterns', []) File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/utils/functional.py", line 80, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/urls/resolvers.py", line 579, in url_patterns patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/utils/functional.py", line 80, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/urls/resolvers.py", line 572, in urlconf_module return import_module(self.urlconf_name) File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1006, in _gcd_import File "<frozen importlib._bootstrap>", line 983, in _find_and_load File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 677, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 728, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/Users/gaku/Programing/mysite/mysite/urls.py", line 22, in <module> path('polls/', include('polls.urls')), File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/urls/conf.py", line 34, in include urlconf_module = import_module(urlconf_module) File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1006, in _gcd_import File "<frozen importlib._bootstrap>", line 983, in _find_and_load File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 677, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 728, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/Users/gaku/Programing/mysite/polls/urls.py", line 3, in <module> from . import views File "/Users/gaku/Programing/mysite/polls/views.py", line 7, in <module> from .forms import QuestionCreateForm, ChoiceFormset File "/Users/gaku/Programing/mysite/polls/forms.py", line 12, in <module> class QuestionCreateForm(forms.ModelForm): File "/Users/gaku/Programing/mysite/venv/lib/python3.7/site-packages/django/forms/models.py", line 266, in __new__ raise FieldError(message) django.core.exceptions.FieldError: Unknown field(s) (choice_text, choice_image) specified for Question

ForeignKeyで参照しているフィールドの指定がうまくいっていないのだと思います。

なお、下のコードだと通ります。

python

1forms.py 2 3from django import forms 4from .models import Question, Choice 5 6 7class QuestionCreateForm(forms.ModelForm): 8 9 def __init__(self, *args, **kwargs): 10 super().__init__(*args, **kwargs) 11 12 class Meta: 13 model = Question 14 fields = ('question_text', 'pub_date', 'question_deadline') 15 16 17ChoiceFormset = forms.inlineformset_factory( 18 Question, Choice, fields='__all__', 19 extra=2, max_num=5, can_delete=False 20) 21

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

Python3.7
Django2系
PyCharm 2019.1.2
MacOS Mojave 10.14.6

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問