django 的 view 如何携带通用数据?
各位大佬好,请教个 django 问题:
我有个需求是这样的,站点标题,版权信息等数据我是以配置的方式存到数据库的。
但是,每一个页面都需要这些配置数据。
我总不能每一个 view 都去写一遍获取配置信息的逻辑吧。
于是我就想抽取一个基类,基类里面写获取这些配置信息的逻辑。其他的 view 继承这个基类
但是问题来了,其他 view 继承后,在 render 的时候,也得写基类获取的变量。
假如以后我在基类中加了新变量,那么所有子类都得加新变量。有没有办法能够完全解耦呢?
谢谢大家~
谢谢大家的解答。 ----------------------- 以下是精选回复-----------------------
答:如果都需要做成基类了,你这个需求本身就不应该放在数据库里面,直接用模板的 include 功能就成了。
{% include 'xxxxx/footer.html' %}
把信息放在数据库也可以,做了后端 api,从数据库里面取信息加上 cache, 前端页面里面用 ajax 调用直接前端渲染。
退一万步非要有这个需要,不要做基类,可以把这些信息写成公用 MIXIN,每个 view 多重继承就可以了。
class SITE_INFO_MIXIN():
title ='xxxx'
copyright = 'xxxxx'
class myview(view, SITE_INFO_MIXIN):
答:写一个函数给 context 注入通用数据就行了?感觉没有必要继承类
答:也可以自定义模板标签,放到 base.html 里面,然后继承这个 base.html 也很方便
答:我认为最佳做法 Django 已经给我们演示了.
即通过配置模板的 context_processors.
比如 Django 默认模板配置的如下 :
```python
# https://docs.djangoproject.com/en/dev/ref/settings/#templates
TEMPLATES = [
{
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.template.context_processors.i18n",
"django.template.context_processors.media",
"django.template.context_processors.static",
"django.template.context_processors.tz",
"django.contrib.messages.context_processors.messages",
],
},
},
```
这些 processor 其实就是一个函数 .返回你需要的对象即可.
比如 messages 这个的实现如下:
```python
from django.contrib.messages.api import get_messages
from django.contrib.messages.constants import DEFAULT_LEVELS
def messages(request):
"""
Return a lazy 'messages' context variable as well as
'DEFAULT_MESSAGE_LEVELS'.
"""
return {
'messages': get_messages(request),
'DEFAULT_MESSAGE_LEVELS': DEFAULT_LEVELS,
}
```
0条评论