2016-08-02 13 views
0

Ich versuche eine Forum-Anwendung zu entwickeln.Wie vermeidet man Logik in der Vorlage?

Ich versuche, das neueste Thema anzuzeigen, das in jeder Kategorie auf einer Eintragsseite gepostet wurde. Allerdings habe ich nach dem Hinzufügen von mehr als einer Kategorie festgestellt, dass ich eine separate Abfrage für jede einzelne Kategorie benötige oder es zeigt nur das neueste Thema insgesamt.

Ich bin nur nicht sicher, wie meine Logik in der Ansicht für die Abfragen zu halten. Natürlich könnte ich die Abfrage innerhalb meiner for-Schleife durchführen, aber das scheint nicht sehr MVT-orientiert zu sein.

Hier ist mein 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}) 

Und mein 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

Statt sich Gedanken, wie dies zu tun, aus Vorlagen sollten Sie einen Weg finden, lesen in die ganze Sache zu tun ** eine ** Datenbankabfrage. – Sevanteri

+0

Ich bin sehr neu in Django, also würde ein wenig Hilfe geschätzt werden. Habe kaum die Spitze seines ORMs gestreift –

+0

Persönlich kann ich nicht helfen, da ich Django seit Jahren nicht mehr benutzt habe. Aber die [Django docs] (https://docs.djangoproject.com/ja/1.9/topics/db/queries/#related-objects) haben natürlich eine Menge Informationen über das Thema und ein bisschen Googeln wird es geben Sie eine Menge Tutorials und Anleitungen. – Sevanteri

Antwort

0

Sie können einen eigenen Template-Tag erstellen, das den neuesten Beitrag für jede Kategorie gibt.

Etwas wie folgt aus:

# 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 %} 

Sie die Dokumentation für weitere Informationen https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/#assignment-tags

Verwandte Themen