如何在 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
的文档
所以我有一个基本的 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
的文档