2016-08-02 101 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