Django Solo帮助处理单例对象
项目描述
Django Solo
+---------------------------+
| |
| |
| \ | Django Solo helps working with singletons:
| /\ | database tables that only have one row.
| >=)'> | Singletons are useful for things like global
| \/ | settings that you want to edit from the admin
| / | instead of having them in Django settings.py.
| |
| |
+---------------------------+
功能
Solo帮助你在Django中强制只实例化一个模型对象。
- 你定义将保存你的单例对象的模型。
- django-solo为你的模型和admin类提供辅助父类。
- 你将获得一个知道只有一个对象的admin界面。
- 你可以从模板中检索对象。
- 通过启用缓存,数据库不会被密集查询。
用例
Django Solo也适用于与具有一对多关系的单例对象一起使用。例如,下面的“首页幻灯片”具有许多“幻灯片”。
- 全局或默认设置
- 具有许多幻灯片的图片幻灯片
- 具有子部分的页面部分
- 具有许多团队成员的团队简介
在一对多关系中,父对象限制为单个实例的情况有很多。
使用示例
# models.py
from django.db import models
from solo.models import SingletonModel
class SiteConfiguration(SingletonModel):
site_name = models.CharField(max_length=255, default='Site Name')
maintenance_mode = models.BooleanField(default=False)
def __str__(self):
return "Site Configuration"
class Meta:
verbose_name = "Site Configuration"
# admin.py
from django.contrib import admin
from solo.admin import SingletonModelAdmin
from config.models import SiteConfiguration
admin.site.register(SiteConfiguration, SingletonModelAdmin)
# There is only one item in the table, you can get it this way:
from .models import SiteConfiguration
config = SiteConfiguration.objects.get()
# get_solo will create the item if it does not already exist
config = SiteConfiguration.get_solo()
在您的模型中,请注意您不需要提供 verbose_name_plural
字段 - 这是因为 Django Solo 使用的是 verbose_name
。
如果您正在将现有的模型(已存储在数据库中的一些对象)更改为单例模型,您可以明确地为 django-solo 提供数据库中行的 id。这可以通过在模型上设置 singleton_instance_id
属性来完成。
class SiteConfiguration(SingletonModel):
singleton_instance_id = 24
# (...)
安装
此应用程序需要 Django 3.2、4.0 或 4.1。
- 使用
pip install django-solo
安装此包 - 将
solo
或solo.apps.SoloAppConfig
添加到您的INSTALLED_APPS
设置中。
这就是您运行测试的方式
./manage.py test solo --settings=solo.tests.settings
并在 tox
内部
python -m pip install tox
tox
支持的语言
- 英语
- 西班牙语
- 德语
管理
标准的 Django 管理界面在处理单例时不太适用,例如,如果您需要在管理界面中编辑一些全局网站设置。Django Solo 提供了一个修改后的管理界面用于此。
- 在列出所有应用程序的主管理页面中,我们有一个
config
应用程序,其中包含用于网站配置的单例模型。 - 配置对象只能更改,没有“添加”链接(1)。
- 到配置页面的链接(2)直接进入表单页面 - 由于只有一个对象,因此不需要中间的对象列表页面。
- 编辑页面有一个修改过的面包屑(3),以避免链接到中间对象列表页面。
- 从编辑页面,我们无法删除对象(4),也不能添加新的对象(5)。
如果您希望禁用跳过对象列表页面的功能,并使用默认的面包屑,您应该在设置中将 SOLO_ADMIN_SKIP_OBJECT_LIST_PAGE
设置为 False
。
在模板中可用性
可以通过给出 Django 模型点路径来从模板检索单例对象
{% get_solo 'app_label.ModelName' as my_config %}
示例
{% load solo_tags %}
{% get_solo 'config.SiteConfiguration' as site_config %}
{{ site_config.site_name }}
{{ site_config.maintenance_mode }}
如果您正在扩展模板,请确保在适当的范围内使用标签。
正确
{% extends "index.html" %}
{% load solo_tags %}
{% block content %}
{% get_solo 'config.SiteConfiguration' as site_config %}
{{ site_config.site_name }}
{% endblock content %}
错误
{% extends "index.html" %}
{% load solo_tags %}
{% get_solo 'config.SiteConfiguration' as site_config %}
{% block content %}
{{ site_config.site_name }}
{% endblock content %}
缓存
默认情况下,缓存被禁用:每次 get_solo
检索单例对象时,都会进行数据库查询。
您可以通过启用缓存,仅在最初检索对象时查询数据库。当从管理界面进行更新时,缓存也会被更新。
缓存超时时间由 SOLO_CACHE_TIMEOUT
设置控制。要使用的缓存后端由 SOLO_CACHE
设置控制。
设置
模板标签名称
您可以使用 get_solo
模板标签在模板中检索您的单例对象。
您可以使用 GET_SOLO_TEMPLATE_TAG_NAME
设置更改 get_solo
的名称。
GET_SOLO_TEMPLATE_TAG_NAME = 'get_config'
管理覆盖标志
默认情况下,管理被覆盖。但如果您希望保留对象列表页面(例如,以自定义操作),您可以将 SOLO_ADMIN_SKIP_OBJECT_LIST_PAGE
设置为 False
。
SOLO_ADMIN_SKIP_OBJECT_LIST_PAGE = True
缓存后端
Django 提供了通过 CACHES
设置定义多个缓存后端的方法。如果您希望单例对象单独缓存,可以像这样定义 CACHES
和 SOLO_CACHE
设置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
},
'local': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
},
}
SOLO_CACHE = 'local'
如果设置为 None
,则将禁用缓存。
缓存超时
缓存超时时间(以秒为单位)。
SOLO_CACHE_TIMEOUT = 60*5 # 5 mins
缓存前缀
用于缓存键的前缀。
SOLO_CACHE_PREFIX = 'solo'
获取代码
代码托管在 https://github.com/lazybird/django-solo/
使用以下方式匿名查看最新开发版本
$ git clone git://github.com/lazybird/django-solo.git
您可以使用以下方式在“可编辑”模式下安装包
pip uninstall django-solo # just in case...
pip install -e git+https://github.com/lazybird/django-solo.git#egg=django-solo
您还可以安装特定的分支
pip install -e git+https://github.com/lazybird/django-solo.git@my-branch#egg=django-solo
包现在已安装到您的项目中,您可以找到代码。
要运行单元测试
pip install tox
tox
发布版本
-
更新
solo/__init__.py
版本
-
更新
CHANGES
-
在GitHub上发布新版本
-
将发布版本上传到PyPI
tox -e build
tox -e upload
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。