跳转至

Admin

参考:https://docs.djangoproject.com/zh-hans/4.0/ref/contrib/admin/

Django Admin 是一个预构建的应用

注册应用

admin.py

from django.contrib import admin
from .models import Demo


admin.site.site_header = "QAdmin"  # 顶部显示名称
admin.site.site_title = 'QAdmin'  # title名称


# Register your models here.
@admin.register(Demo)  # 也可以这样:admin.site.register(Demo, DemoAdmin)
class DemoAdmin(admin.ModelAdmin):
    # 详情页
    inlines = [StepInline]  # 改为行内布局,默认StackedInline堆叠布局
    fields = (('is_test', 'expect_succeed'), 'note')  # 显示的字段,同一元组的字段显示在同一行
    exclude = ('creator','created_date','modified_date')  # 不显示的字段

    readonly_fields = ('my_field',)  # 设置字段为只读

    # 列表页
    list_display = ("name", 'cmd', "group", 'creator', 'created_date', 'modified_date')  # 在列表中显示的字段
    list_display_links = ('subject', 'currency')  # 可点击跳转到详情页的字段,默认为list_display第一个字段,为None将没有任何链接
    list_editable = ("group",)  # 列表中可编辑的字段,list_display_links中的字段不允许设置为可编辑的
    list_filter = ("group", "creator")  # 列表中可筛选的字段,默认支持多个字段联合筛选,利用双下划线可以进行跨表关联
    search_fields = ("name", 'cmd')  # 列表中可被搜索的字段

    ordering = ('id',)  # 列表自动排序字段
    sortable_by = ("subject")  # 支持手动排序的字段,不限制则所有list_display字段都可以排序,空元组则禁用所有排序

    # 如果设置了创建者字段,加入此方法表示保存时自动添入当前User为创建者
    def save_model(self, request, obj, form, change):
        if obj.creator is None:
            obj.creator = request.user
        super().save_model(request, obj, form, change)

    """
    列表的action中默认只有删除数据
    我们可以添加自定义的action
    """
    # 指定action
    actions = ["demo_action"]
    # 定义action
    def demo_action(self):
        pass
    demo_action.short_description = "脚本显示名称"
    # 将action加入到admin下拉框中显示
    def get_action_choices(self, request):
        choices = super(DemoAdmin, self).get_action_choices(request)
        choices.pop(0)
        choices.reverse()
        return choices


# 可将多个模型注册到同一个类上
@admin.register(Exchange, Subject, Currency)
class HiddenModelAdmin(admin.ModelAdmin):
    # 隐藏模型,不在导航上显示索引,但仍然可以外键引用的时候编辑和新建
    def has_module_permission(self, request) -> bool:
        return False

创建管理员账号

# 创建后台管理员账号
python manage.py createsuperuser
# 根据提示输入用户名邮箱和密码
#   admin
#   admin@zuoright.com
#   密码不能少于8位,且不能全是数字:password
# 访问后台:127.0.0.1:8000/admin
# 进入交互式命令行
python manage.py shell  # 可以安装ipython扩展使用体验更好的shell_plus

# 重置用户密码
from django.contrib.auth.models import User
user = User.objects.get(username='admin')
user.set_password('xxxx')
user.save()

修改应用在后台的显示名

参考:https://docs.djangoproject.com/zh-hans/4.0/ref/applications/#for-application-authors

from django.apps import AppConfig


class OnestepConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'onestep'  # 应用名
    verbose_name = '一步'  # 显示名,不设置此字段时默认为应用名

后台任务

pip install celery redis

  • 配置
# myproject/celery.py
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

app = Celery('myproject')

app.config_from_object('django.conf:settings', namespace='CELERY')

# 使用 Redis 作为消息代理
# app.conf.broker_url = 'redis://localhost:6379/0'

app.autodiscover_tasks()
  • 初始化

保证 Celery 应用和 Django 项目能够协同工作

同时确保 Celery 的各种设置和任务能够在 Django 项目启动时被正确加载和初始化

# myproject/__init__.py
from .celery import app as celery_app

__all__ = ('celery_app',)
  • 编写异步任务
# myapp/tasks.py
from myproject.celery import app
from time import sleep

@app.task
def generate_user_report(user_id):
    # 模拟一个耗时的报告生成过程
    sleep(10)
    print(f"Report generated for user: {user_id}")  # 实际中这里会有生成报告的逻辑
  • 触发任务
# views.py 或其他适当的地方
from .tasks import generate_user_report

# 用户注册时触发任务
def user_signup(request):
    # ...
    # 使用 .delay() 来异步执行任务
    """
    delay 是 apply_async 的简化版本,立即将任务发送到队列中
    只接受任务的参数,不带任何额外的选项或参数
    """
    generate_user_report.delay(user.id)

# 使用 .apply_async() 来异步执行任务
result = my_task.apply_async(link=on_task_success.s())

"""
使用 .delay() 或 .apply_async() 触发 Celery 任务时,会返回一个 AsyncResult 实例。
这个对象可以用来查询任务的状态和结果
"""
# 使用回调函数,在任务成功执行后自动调用
@app.task
def on_task_success(result):
    print(f"Task completed successfully with result: {result}")
  • 在命令行中启动 Celery worker

运行一个或多个进程,监听消息队列,等待执行异步任务

celery -A myproject worker --loglevel=info
  • 使用 Celery Flower 监视和管理 Celery 集群
pip install flower

celery -A myproject flower

最后更新: 2023-11-28