Djangoのフォームで書いた内容が反映されない
Djangoでブログを作成しています。ブログの作成画面をCreateViewを継承したクラスビューで実現しようとしているのですが、うまくいかずに困っています。
###環境・前提
Django 3.1.1
pycharm
postgreSQL
書いたコード
urls.py
python
1from django.contrib import admin 2from django.urls import path, include 3from django.contrib.staticfiles.urls import static 4 5from . import settings 6 7urlpatterns = [ 8 path("", include("QuantumGun.urls")), 9] 10 11#開発サーバーでメディアを配信できるように設定 12urlpatterns += static( 13 settings.MEDIA_URL, 14 document_root=settings.MEDIA_ROOT 15) 16
QuantumGun.urls.py
python
1from django.urls import path 2from django.contrib import admin 3from .views import Entrance, About, Contact, BlogList, BlogDetail, BlogCreate, formfunc 4 5urlpatterns = [ 6 #管理画面 7 path('admin/', admin.site.urls), 8 9 #メインルートとは独立したページ 10 path("create/", BlogCreate.as_view(), name="create"), 11 12 #Entrance画面と直接つながってるページ 13 path("", Entrance.as_view(), name="Entrance"), 14 path("about/", About.as_view(), name="about"), 15 path("contact/", Contact.as_view(), name="contact"), 16 path("blog", BlogList.as_view(), name="blog"), 17 18 #更に1階層下へ 19 path("detail/<int:pk>/", BlogDetail, name='detail') 20]
QuantumGun.views.py
python
1from django.views.generic import TemplateView, ListView, DetailView, CreateView 2from django.shortcuts import render, redirect 3from .forms import DiaryCreateForm 4from django.urls import reverse_lazy 5from django.contrib import messages 6 7from .models import BlogModel4 8 9 10# Create your views here. 11class Entrance(TemplateView): 12 template_name = "Entrance.html" 13 14class Contact(TemplateView): 15 template_name = "contact.html" 16 17class About(TemplateView): 18 template_name = "about.html" 19 20class Blog(TemplateView): 21 template_name = "index.html" 22 23class BlogList(ListView): 24 template_name = "BlogList.html" 25 model = BlogModel4 26 27class BlogDetail2(DetailView): 28 template_name = "BlogDetail.html" 29 model = BlogModel4 30 print("HelloWorld") 31 32def BlogDetail(request, pk): 33 object=BlogModel4.objects.get(pk=pk) 34 print("Hello") 35 print(object.pageView) 36 37 object.pageView+=1 38 object.save() 39 40 return render(request, "BlogDetail.html", {"object": object}) 41 42class BlogCreate(CreateView): 43 model = BlogModel4 44 template_name = "diary_create.html" 45 form_class = DiaryCreateForm 46 success_url = reverse_lazy("blog") 47 print("KKKKKKKKKKK") 48 49 def form_valid(self, form): 50 diary = form.save(commit=False) 51 diary.user = self.reqest.user 52 diary.save() 53 messages.success(self.request, "Create Diary") 54 return super().form_valid(form) 55 56 def form_invalid(self, form): 57 messages.error(self.request, "You can't create Blog") 58 return super().form_invalid(form)
QuantumGun.model.py
python
1from django.db import models 2 3# Create your models here. 4CATEGORY = ( 5 ("python", "python"), 6 ("Django", "Django"), 7 ("FIRE", "FIRE"), 8 ("html/css", "html/css"), 9 ("数学", "数学"), 10 ("物理", "物理"), 11 ("データサイエンス", "データサイエンス") 12) 13 14class BlogModel4(models.Model): 15 title = models.CharField(max_length=100) 16 contentDescription = models.TextField(max_length=150) 17 postdate = models.DateField(auto_now_add=True) 18 updateDate = models.DateField(auto_now=True) 19 category = models.CharField( 20 max_length=50, 21 choices=CATEGORY 22 ) 23 SmallCategory = models.CharField( 24 max_length=50, 25 choices=CATEGORY 26 ) 27 eyeCatch = models.ImageField( 28 verbose_name="アイキャッチ画像", 29 blank=True, 30 null=True 31 ) 32 pageView = models.PositiveIntegerField(default=0) 33 content = models.TextField() 34 35 def __str__(self): 36 return self.title
QuantumGun.forms.py
python
1from .models import BlogModel4 2from django import forms 3 4class DiaryCreateForm(forms.ModelForm): 5 6 class Meta: 7 model = BlogModel4 8 fields = ( 9 "title", 10 "contentDescription", 11 "category", 12 "SmallCategory", 13 "eyeCatch", 14 "pageView", 15 "content" 16 ) 17 def __init__(self, *args, **kwargs): 18 super().__init__(*args, **kwargs) 19 for field in self.fieldsfile:/Users/ilovephys/Desktop/purple2/purpleDiary/QuantumGun/templates/diary_create.html.values(): 20 field.widget.attrs["class"] = "form-control"
QuantumGun.Templates.diary_create.html
html
1{% extends "diaryBase.html" %} 2 3{% load static %} 4 5{% block title %} 6 {{ object.title }} 7{% endblock %} 8{% block titleContsnts %} 9 <div class="title"> 10 <h1>Blog Create</h1> 11 <div class="genre"> 12 <span>Admin</span> 13 <span>Murasaki PurPle</span> 14 </div> 15 </div> 16{% endblock %} 17 18{% block eyeCatchPic %} 19 <img class="eyeCatchPic" src="{% static 'img/koke.jpg' %}"> 20{% endblock %} 21 22 23{% block contentsIndex %} 24 25{% endblock %} 26 27{% block contentsSection %} 28 <form method="POST" enctype="multipart/form-data"> {% csrf_token %} 29 <table class="table"> 30 {{ form.as_table }} 31 </table> 32 <button type="submit">create</button> 33 </form> 34{% endblock %} 35 36{% block reverse %} 37 {% url 'blog' %} 38{% endblock %}
結果
http://127.0.0.1:8000/create
にアクセスしました。
QuantumGun.forms.py
で書いたように、ブラウザ上に必要な項目が全て表示されています。
画像の下にあるボタン[create]を押すと、
QuantumGun.views.py
success_url = reverse_lazy("blog")
に従い
http://127.0.0.1:8000/blog
に遷移します。以下が遷移した時の画像です。
QuantumGun.forms.py
で記述した物が反映されていません。
試したこと
クラスベースビューではなく、関数ベースビューでも試してみましたが 結果は変わりませんでした。
def formfunc(request): if request.method == 'POST': form = DiaryCreateForm(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() return redirect('blog') else: form = DiaryCreateForm() return render(request, 'diary_create.html', {'form': form})
いつもありがとうございます
teratailで質問すると、いつも親切な回答をいただきます。
本当に助かっております。
今回も、お力を貸していただけないでしょうか。
追加で試したこと2020/9/22
関数ベースビューで実行し、途中でprint()を挟んでどのように動作したのか確認しました。
QuantumGun.view.py
python
1def formfunc(request): 2 print("aaa") 3 if request.method == 'POST': 4 print("POST") 5 form = DiaryCreateForm(request.POST) 6 if form.is_valid(): 7 post = form.save(commit=False) 8 post.author = request.user 9 post.save() 10 print("redirect") 11 return redirect('BlogList') 12 else: 13 print("nothing") 14 15 else: 16 form = DiaryCreateForm() 17 print("新規の空フォームを生成") 18 return render(request, 'diary_create.html', {'form': form})
これで、/createに入った場合 terminal上では
terminal
12020-09-22 00:58:58,134¥t[INFO]¥t/Users/××/Desktop/purple2/lib/python3.6/site-packages/django/core/servers/basehttp.py(Line:157)¥t"GET / HTTP/1.1" 200 2489 2aaa 3新規の空フォームを生成
のように表示されるはずです(なりました)。
フォームに必要事項を記載し「createボタン」を押せば、viewの最初のif文が実行され
terminal
1POST 2redirect
と表示されるはずです。しかし、表示されませんでした。さらにおかしなことに、QuantumGun.view.pyにおける「BlogListに遷移する部分が実行されていないにもかかわらず」"BlogList"に画面が遷移してしまいました。
あなたの回答
tips
プレビュー