前提・実現したいこと
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
あなたの回答
tips
プレビュー