如何在 Django 模板中显示数据库信息之前对其进行操作?

How to manipulate database info before displaying it in Django template?

所以我有一个基本的 Django 网站设置,它显示来自数据库的动态信息。

我希望能够操作来自数据库的文本,这样我就可以创建 BBCode 解析器或任何我想要的东西。我是 Django 的新手,所以对于应该在哪里完成我有点困惑。

这些是我目前的文件...

Models.py

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=140)
    body = models.TextField()
    date = models.DateTimeField()

    def __str__(self):
        return self.title

Urls.py

from django.conf.urls import url, include
from django.views.generic import ListView, DetailView
from forum.models import Post

urlpatterns = [
    url(r'^$', ListView.as_view(queryset=Post.objects.all().order_by("-date")[:25], template_name="forum/forum.html")),
    url(r'^(?P<pk>\d+)$', DetailView.as_view(model = Post, template_name = 'forum/post.html')),
]

Forum.html

{% extends "layout.html" %}

{% block body %}
    {% for post in object_list %}
        <p>{{ post.date|date:"Y-m-d" }}<a href="/forum/{{post.id}}"> {{ post.title }}</a></p>
    {% endfor %}
{% endblock %}

Functions.py

def bbcode(data):
    data2 = data + "some random text"

    return data2

所有这些文件都位于 "forum" 目录中,该目录位于 "coolsite".

根项目文件夹中

所以我的理解是我需要在某处导入 functions.py 并使用 bbcode() 方法来操作从数据库中提取的文本。这样,一旦显示在 "forum.html" 模板上,它就会被解析。

抱歉,如果这是一个重复的问题。我四处搜寻,并不能完全找到我要找的东西。

我应该怎样做呢?

您需要覆盖 ListView 方法。您需要对代码进行一些更改:

  • 为您的 url 配置设置自定义视图

urls.py

from django.conf.urls import url, include
from django.views.generic import ListView, DetailView
from forum.models import Post
from forum.views import PostList

urlpatterns = [
    url(r'^$', PostList.as_view(), name='post_list'),
    url(r'^(?P<pk>\d+)$', DetailView.as_view(model = Post, template_name = 'forum/post.html')),
]
  • 基于 ListView

    在您的应用程序 (forum.views) 中创建自定义视图
    # views.py
    
    from django.views.generic import ListView
    from forum.models import Post
    
    
    class PostList(ListView):
    
    model = Post
    template_name = "forum/forum.html"
    
    # here is where magic happens
    def get_context_data(self, *args, **kwargs):
        context = super(PostList, self).get_context_data(*args, **kwargs)
        # context has the same context that you get in your template before
        # so you can take data and work with it before return it to template
        return context
    

您可以找到 Class-Based Views here

的文档