2016-08-02 79 views
0

我正在尝试开发一个论坛应用程序。如何避免模板中的逻辑?

我正试图显示列表页面上每个类别中发布的最新主题。不过,我在添加了多个类别之后意识到,我需要为每个单独的类别单独进行查询,或者只显示整个最新的主题。

我只是不知道如何让我的逻辑在查询的视图。很明显,我可以在我的for循环中执行查询,但这看起来不是很适合MVT。

这里是我的views.py:

from django.shortcuts import render 
from .models import ForumReply, ForumCategory, ForumTopic 

def index(req): 
    categories = ForumCategory.objects.all() 

    #find latest topic or topic by reply 
    topic = ForumTopic.objects.latest('created_at') 
    reply = ForumReply.objects.latest('created_at') 

    if (topic.created_at > reply.created_at): 
     latest = topic 
    else: 
     latest = reply.topic 

    return render(req, "forum/category_listing.html", 
        {'categories': categories, 'latest': latest}) 

而且我category_listing.html:

{% extends '__base.html' %} 
{% block content %} 

    {% for category in categories %} 
    <div class="forum_category"> 
     <h1><a href="{% url 'forum_topic_list' category.pk 1 %}">{{ category.title }}</a></h1> 
     {{ category.body }} 
     <br /> 
     <em>Latest Post: </em> {{ latest.title }} by {{ latest.user }} at {{ latest.created_at|date:"D d F Y h:i" }} 
    </div> 
    <br /> 
    {% endfor %} 

{% endblock %} 
+2

而是担心如何做到这一点的模板,你应该找到一种方法,做这件事的**一个**数据库查询。 – Sevanteri

+0

我对Django很新,所以有一点帮助将不胜感激。几乎没有擦过它的ORM的一角 –

+0

就个人而言,我不能帮助,因为我多年来没有使用过Django。但[Django文档](https://docs.djangoproject.com/ja/1.9/topics/db/queries/#related-objects)当然有很多关于该主题的信息,并且一些Google搜索会给出你一大堆教程和指南。 – Sevanteri

回答

0

您可以创建一个自定义模板标签返回最新帖子为每个类别。

事情是这样的:

# views.py 
def index(req): 
    categories = ForumCategory.objects.all() 
    return render(req, "forum/category_listing.html", {'categories': categories}) 

# templatetags/category_tags.py 
@register.assignment_tag 
def get_latest_post(category): 
    # perform logic here for selecting latest post for specific category 
    return latest 


# category_listing.html 
{% load category_tags %} 
{% for category in categories %} 
    {% get_latest_post category as latest %} 
    <em>Latest Post: </em> {{ latest.title }} by {{ latest.user }} at {{ latest.created_at|date:"D d F Y h:i" }} 
{% endfor %} 

你可以阅读文档的详细信息https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/#assignment-tags