###初めにご挨拶
プログラミング初心者です
現在独学でプログラミングを勉強しています
情報源はネットのみです
質問が下手くそなので先に謝りたいと思います
申し訳ありません
前提・実現したいこと
現在Djangoで掲示板を作ろうとしています
スレッドをクリック
↓
選択したスレッドの投稿一覧を表示
ということをしたいです
発生している問題・エラーメッセージ
ですが現在はどのスレッドをクリックしても
全ての投稿が表示されます
仕組みとして
スレッドはサイト運営者がadminサイトで作成・削除を行い
投稿はユーザーがウェブブラウザ上から投稿します
希望する条件としては
投稿画面はListView(もしくはDetailView)とCreateViewを組み合わせて
一つの画面で表示したいです
そもそも根本的なこと変えたほうがいいだとか
こういうやり方の方が後々ラクだとかがあれば
それも教えて頂きたいです
丸投げな質問過ぎますかね…
該当のソースコード
ディレクトリ構造は、以下です。
├── bbs │ ├── __init__.py │ ├── templates(以下省略) │ ├── __pycache__(以下省略) │ ├── admin.py │ ├── apps.py │ ├── migrations(以下省略) │ ├── models.py │ ├── urls.py │ ├── forms.py │ ├── tests.py │ └── views.py ├── db.sqlite3 ├── manage.py ├──myvenv(以下省略) └── pj ├── __init__.py ├── __pycache__(以下省略) ├── settings.py ├── urls.py └── wsgi.py
urls.py(bbsディレクトリ)
python
1from django.urls import path 2from .views import ThreadListView,PostCreateAndListView 3 4app_name = 'bbs' 5urlpatterns = [ 6 path('thread/', ThreadListView.as_view(), name='thread'), 7 path('thread/<int:pk>/', PostCreateAndListView.as_view(), name='post'), 8]
views.py
python
1from django.shortcuts import render 2from django.urls import reverse_lazy 3from django.views.generic.edit import CreateView 4from django.views.generic import ListView, DetailView 5from .models import Thread,Post 6from .forms import ThreadForm, PostForm 7 8class ThreadListView(ListView): 9 model = Thread 10 template_name = "bbs/thread.html" 11 12class PostCreateView(CreateView): 13 form_class = PostForm 14 template_name = "bbs/post.html" 15 success_url = reverse_lazy('bbs:post') 16 17class PostListView(ListView): 18 model = Post 19 20class PostCreateAndListView(PostCreateView,PostListView): 21 def get(self, request, *args, **kwargs): 22 formView = PostCreateView.get(self, request, *args, **kwargs) 23 listView = PostListView.get(self, request, *args, **kwargs) 24 formData = formView.context_data['form'] 25 listData = listView.context_data['object_list'] 26 context = {'form' : formData, 'post_list' : listData} 27 return render(request, 'bbs/post.html', context)
forms.py
python
1from django import forms 2from .models import Thread,Post 3 4 5class ThreadForm(forms.ModelForm): 6 class Meta: 7 model = Thread 8 fields = ("subject",) 9 10class PostForm(forms.ModelForm): 11 class Meta: 12 model = Post 13 fields = ("message",)
models.py
python
1from django.db import models 2from django.utils import timezone 3from account.models import User 4 5 6class Thread(models.Model): 7 subject = models.CharField(max_length=255) 8 9 def __str__(self): 10 return self.subject 11 12class Post(models.Model): 13 thread = models.ForeignKey(Thread, on_delete=models.CASCADE, null=True, related_name='threads') 14 message = models.TextField(max_length=3000) 15 created_at = models.DateTimeField(auto_now_add=True) 16 created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='post', null=True) 17 def __str__(self): 18 return self.message
thread.html
python
1{% extends 'home/base.html' %} 2 3{% block content %} 4 <div class="contents"> 5<ul> 6 {% for item in object_list %} 7 <li><a href="{% url 'bbs:post' pk=item.pk %}">{{ item }}</a></li> 8 {% endfor %} 9</ul> 10 </div> 11 12 13{% endblock %}
post.html
python
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>タイトル</title> 6</head> 7<body> 8 <h1>掲示板だよ</h1> 9 <ul> 10 {% for post in post_list %} 11 <li>本文:{{ post.message }}</li> 12 <li>投稿日時:{{ post.created_at }}</li> 13 <li>投稿者:{{ post.created_by }}</li> 14 {% endfor %} 15 </ul> 16 <p>とうこうするよ</p> 17 <form action="" method = "POST"> 18 {% csrf_token %} 19 {{ form.as_p }} 20 <input type="submit"> 21 </form> 22</body> 23</html>
試したこと
ネットでひたすら調べるも一ヶ月以上経ってしまった
補足情報(FW/ツールのバージョンなど)
Python 3.7.3
Django 2.1.7
pytz 2018.9
OSバージョン Windows8.1
サーバー ローカルサーバ
利用している環境などの情報も
どんなことを書けばいいのかすら分かりません
必要な情報があれば教えて頂ければ随時追加したいと思います
###頂いた回答を元に作成し直しました。
希望通りの動きをしています。
urls.py
python
1from django.urls import path 2from .views import ThreadListView,post_list 3 4app_name = 'bbs' 5urlpatterns = [ 6 path('thread/', ThreadListView.as_view(), name='thread'), 7 path('thread/<int:pk>/', post_list, name='post'), 8]
views.py
python
1from django.shortcuts import redirect, render, get_object_or_404 2from django.urls import reverse_lazy 3#from django.views.generic.edit import CreateView 4from django.views.generic import ListView #DetailView TemplateView 5from .models import Thread,Post 6from .forms import ThreadForm, PostForm 7 8class ThreadListView(ListView): 9 model = Thread # Thread.objects.all()を裏側でやってくれてる 10 template_name = "bbs/thread.html" 11 12def post_list(request, pk): 13 per_page = 10 14 15 thread = get_object_or_404(Thread,pk=pk) 16 post_list= Post.objects.filter(thread=thread) 17 form = PostForm(request.POST or None) 18 19 if form.is_valid(): 20 post = form.save(commit=False) 21 post.thread = thread 22 post.save() 23 return redirect('bbs:post', pk=thread.pk) 24 25 context = {'form': form, 'post_list': post_list} 26 return render(request, 'bbs/post.html', context)
回答1件
あなたの回答
tips
プレビュー