前提・実現したいこと
前回このような形でListViewとCreateViewを1つのページで表示させられるようにしました。
今度はCreateViewに画像アップロード機能を加えるべくmodels.pyに以下のコードを加え各種設定をいたしました。
python
1file = models.FileField('ファイル', blank=True, null=True)
発生している問題・エラーメッセージ
しかし投稿フォームの送信ボタンを押すと画像のようにエラーが出てしまいます。
該当のソースコード
urls.py
python
1 2from django.urls import path 3 4from . import views 5 6app_name = 'board' 7urlpatterns = [ 8 path('', views.FormAndListView.as_view(), name='board'), 9] 10 11
models.py
python
1 2from django.db import models 3from django.utils import timezone 4 5class Post(models.Model): 6 class Meta: 7 verbose_name = '投稿' 8 verbose_name_plural = '投稿リスト' 9 10 name = models.CharField('名前', max_length=20) 11 text = models.TextField('本文') 12 date = models.DateTimeField('日付', default=timezone.now) 13 file = models.FileField('ファイル', blank=True, null=True) 14 15 16 def __str__(self): 17 return self.text 18 19
forms.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from django import forms from django.views import generic from .models import Post class PostForm(forms.ModelForm): #fileアップロード部分のラベルを消去 file = forms.FileField( label='' ) class Meta: model = Post fields = ('name', 'text', 'file')
views.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from .models import Post from django.urls import reverse_lazy from django.shortcuts import render from .forms import PostForm from django.views import generic #from django.views.generic.base import TemplateResponseMixin class FormView(generic.CreateView): model = Post form_class = PostForm template_name = 'board/board.html' success_url = reverse_lazy('board:board') class ListView(generic.ListView): model = Post def get_queryset(self): return Post.objects.order_by('-date') class FormAndListView(FormView, ListView):#, TemplateResponseMixin) def get(self, request, *args, **kwargs): formset = PostForm(request.POST or None, files=request.FILES or None) formView = FormView.get(self, request, *args, **kwargs) listView = ListView.get(self, request, *args, **kwargs) formData = formView.context_data['form'] listData = listView.context_data['object_list'] context = {'form' : formData, 'post_list' : listData} return render(request, 'board/board.html', context)
board.html
<form action="" method="POST"> {{ form.as_p }} <button type="submit">送信</button> {% csrf_token %} </form> {% for post in post_list %} <p>{{ post.name }}</p> <p>{{ post.text | linebreaksbr }}</p> {% if post.file %} <p><img src="{{ post.file.url }}" ></p> {% endif %} <p>{{ post.date }}</p> {% endfor %}
管理画面からは画像を送信でき、なおかつboard.htmlに一覧表示されるためhtmlに問題はないと思っています。
試したこと①
views.pyにTemplateResponseMixinをいれてみました
python
1 2from django.views.generic.base import TemplateResponseMixin 3 4 5class FormAndListView(FormView, ListView, TemplateResponseMixin): 6 def get(self, request, *args, **kwargs): 7 formset = PostForm(request.POST or None, files=request.FILES or None) 8 formView = FormView.get(self, request, *args, **kwargs) 9 listView = ListView.get(self, request, *args, **kwargs) 10 formData = formView.context_data['form'] 11 listData = listView.context_data['object_list'] 12 context = {'form' : formData, 'post_list' : listData} 13 return render(request, 'board/board.html', context) 14 15
試したこと②
class FormAndListView内のobject_listをpost_listに変更いたしました。
python
1 2 3listData = listView.context_data['object_list']→listData = listView.context_data['post_list'] 4 5
試したこと③
class FormAndListView内の下の一文を追加し
python
1 2 3 formset = UploadModelFormSet(request.POST or None, files=request.FILES or None) 4 5
contextにも追加いたしました。
context = { 'formset': formset, }
しかしいずれも送信フォームを押すと'FormAndListView' object has no attribute 'object_list'が出現してしまいます。
フォームからの画像のアップロード自体はListViewとMixさせなければ成功するのですが・・・。
ぜひよろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
python=3.7.0
django=(2, 0, 2, 'final', 0)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/25 03:53
2019/01/25 03:56
2019/01/25 03:57
2019/01/25 04:01
2019/01/25 04:13
2019/01/25 06:57
2019/01/25 06:58
2019/01/26 03:59
2019/01/26 09:41
2019/01/27 09:32