Djangoはこのviews.pyが理解の肝だと思いますので、本などでじっくり勉強するとよいでしょう。
model.pyで、TopにPostの一覧、CategoryにCategory毎のPostの一覧、Postに内容を表示するように定義しましたので、views.pyの中でそれぞれのクラスを作り、一覧を表示するものはListView、内容を表示するものはDetailViewを使用します。
CategoryはCategory名をそのままURLの一部に使いたいので、少し特殊なやり方をします。Categoryの一覧を別に関数で定義をしておき、その内容をリストに保存します。Narito Blogさんのcontext_processorsを使うを参考にして、myproject下のmyprojectフォルダ内のsetting.pyを編集します。TEMPLATESの中のcontext_processorsの中にblog.context_processors.commonを追加してください。そして、blogフォルダの下にcontext_processors.pyを作成して、以下のコードを記載します。
from .models import Category
def common(request):
context = {category_list: Category.objects.all()
return context
views.pyは
from django.views import generic
from .models import Post,Category
# Create your views here.
class PostList(generic.ListView):
model = Post
template_name = blog/index.html
class CategoryPost(generic.ListView):
model = Post
template_name = blog/category_post.html
def get_queryset(self):
category = Category.objects.get(lang_type=self.kwargs[category])
queryset = Post.objects.order_by(-id).filter(category=category)
return queryset
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
context[category_key] = self.kwargs[category]
return context
class PostDetail(generic.DetailView):
model = Post
template_name = blog/post_detail.html
となります。template_nameはblog/以下はurls.pyで指定したnameと同じにしてください。これでMTVモデルは完成です。次回はhtmlファイルを作成し、デプロイしましょう。