详解django实现自定义manage命令的扩展

yizhihongxing

下面我将详细讲解“详解django实现自定义manage命令的扩展”的完整攻略,过程中包含两条示例说明。

什么是manage.py命令

在Django中,我们一般使用manage.py命令行工具来进行项目相关操作,例如启动服务器、创建数据库、添加管理员账户等等。

为什么需要自定义manage.py命令

虽然Django自带的manage.py命令已经非常丰富,但是有时候我们需要自己创建一些自定义的命令来解决项目中的特定问题,或者简化一些重复性的操作。这时候就需要我们自定义manage.py命令了。

如何实现自定义manage.py命令

要实现自定义manage.py命令,需要在Django项目中创建一个命令文件,然后在该文件中定义我们需要的命令。接下来分别讲解如何创建命令文件和如何定义自定义命令:

创建命令文件

先在Django项目的根目录下创建managementcommands文件夹,然后在commands文件夹下创建一个Python文件,命名为我们所需要的命令名,例如my_command.py

命令文件的目录结构如下:

.
└── my_project/
    ├── manage.py
    ├── my_app/
    ├── my_project/
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── my_command/
        ├── __init__.py
        └── commands/
            ├── __init__.py
            └── my_command.py

定义自定义命令

my_command.py中定义一个类,继承自django.core.management.base.BaseCommand。该类必须包括handle方法,这个方法是自定义命令的核心实现。

例如,下面是一个读取某文件内容到数据库的命令:

from django.core.management.base import BaseCommand
from my_app.models import MyModel

class Command(BaseCommand):
    def handle(self, *args, **kwargs):
        # 读取文件
        with open('file.txt', 'r') as f:
            content = f.read()
            # 写入数据库
            MyModel.objects.create(content=content)

类中的其他方法和属性也可以被重载和定义,例如help属性可以定义命令帮助信息。

注册自定义命令

最后,在my_app下的__init__.py文件中添加如下代码:

# my_app/__init__.py
default_app_config = 'my_command.apps.MyCommandConfig'

接下来,在my_command下新建一个apps.py文件,注册自定义命令。

from django.apps import AppConfig

class MyCommandConfig(AppConfig):
    name = 'my_command'
    verbose_name = "My Command"

    def ready(self):
        import my_command.commands.my_command

这样,我们就可以在命令行中执行我们自定义的my_command命令了。

示例一

下面给一个示例,对于所有存在过更新记录的表,在更新记录中添加一条新纪录。

  1. 在对应的app中创建management/commands文件夹。

  2. 创建名为update_all_tables.py的文件,定义更新数据的代码。

from django.core.management.base import BaseCommand
from app.models import *

class Command(BaseCommand):

    help = ("Add a new record to all tables which already have update records")

    def handle(self, *args, **options):
        for model in [table_model for table_model in (Table1, Table2, Table3)
                      if UpdateRecord.objects.filter(table_name=table_model.__name__).exists()]:
            last_update = model.update_records.last()
            model.update_records.create(updater="admin",
                                         update_time=datetime.datetime.now(),
                                         differences=None,
                                         record_after_changes=last_update.record_after_changes,
                                         note="Automatically added record by command update_all_tables")
  1. 在相应目录下执行python manage.py update_all_tables使用该扩展命令。

示例二

下面给另一个示例,向后台admin页面中添加一个命令,让用户可以在后台页面进行操作。

  1. app下创建一个名为admin.py的文件。
from django.contrib import admin
from django.urls import reverse
from django.utils.safestring import mark_safe
from django.http import HttpResponseRedirect
from django.urls import path, include
from django.conf import settings
from django.views.generic import TemplateView

from my_app.my_command import MyCommand

class ModelAdmin(admin.ModelAdmin):

    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            path('my_command/', self.admin_site.admin_view(self.my_view))
        ]
        return my_urls + urls

    def my_view(self, request):
        if request.method == 'POST':
            form = MyForm(request.POST)
            if form.is_valid():
                MyCommand().my_method(form.cleaned_data['name'], form.cleaned_data['text'])
                self.message_user(request, "Operation completed successfully.")
                return HttpResponseRedirect('../')
        else:
            form = MyForm()

        context = {
            'title': 'My Command',
            'form': form
        }

        return TemplateView.as_view(template_name='my_app/my_command_template.html')(request=request, context=context)

admin.site.register(MyModel, MyModelAdmin)
  1. 创建一个HTML模板my_command_template.html,用于后台页面,实现数据的录入。
{% extends 'admin/base_site.html' %}
{% load static %}

{% block extrahead %}
    {{ block.super }}
    <script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery-3.4.1.min.js' %}"></script>
    <script type="text/javascript" src="{% static 'admin/js/jquery.init.js' %}"></script>
    <script type="text/javascript" src="{% static 'admin/js/actions.js' %}"></script>
{% endblock %}

{% block content %}
    <div class="container-fluid">
        <div class="row">
            <div class="col xs-12">
                <div class="submit-row">
                    <form method="POST">
                        {% csrf_token %}
                        <div class="form-group">
                            <label for="name">Name:</label>
                            <input type="text" class="form-control" id="name" name="name">
                        </div>
                        <div class="form-group">
                            <label for="text">Text:</label>
                            <textarea class="form-control" id="text" name="text" rows="3"></textarea>
                        </div>
                        <button type="submit" class="btn btn-primary">Submit</button>
                    </form>
                </div>
            </div>
        </div>
    </div>

    <script>
        window.addEventListener("load", function () {
            jQuery("#content-main").addClass("overflow-auto");
        });
    </script>

{% endblock %}
  1. 创建一个MyCommand类,用于后台数据处理。
class MyCommand(object):
    def my_method(self, name, text):
        # 处理数据的方法

以上就是如何使用Django实现自定义manage命令的扩展,并且以两个示例进行了说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解django实现自定义manage命令的扩展 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 部署Django项目在IIS10上

    系统及软件版本 Windows Server 2012 Standard IIS 8.0 Anaconda3 4.0.0 64位 (搭载python3.5.1) Django 1.10.1 首先确保自己的django网站在服务器上可以通过命令行 runserver 正常运行。 2. IIS配置 添加角色与功能 在服务器管理器中,添加角色与功能 添加角色与功能…

    Django 2023年4月16日
    00
  • Django零基础入门之路由path和re_path详解

    我将详细讲解“Django零基础入门之路由path和re_path详解”的完整攻略,包括两条示例说明。 什么是Django路由? Django路由是负责将 URL 转化为视图的函数或方法的机制。路由将 URL 映射到相应的视图上,以处理用户发出的请求。 Django路由规则都存储在每一个应用的 urls.py 文件中。 path路由 在 Django 2.0…

    Django 2023年5月16日
    00
  • django-restframework

    一、安装与使用 1.安装 >: pip3 install djangorestframework 2.使用 在settings.py中注册: INSTALLED_APPS = [ …. ‘api.apps.ApiConfig’, # drf必须注册 ‘rest_framework’, ] 模块 # drf的封装风格 from rest_framew…

    Django 2023年4月13日
    00
  • django 的 MTV 流程图

         

    Django 2023年4月12日
    00
  • Python+Django实现简单HelloWord网页的示例代码

    接下来我将为您详细讲解“Python+Django实现简单HelloWord网页的示例代码”的完整攻略,包括两个示例说明。 示例1:简单的HelloWorld网页 Step 1. 安装Django 首先,要确保在您的电脑上已经安装了Python。然后,在终端中执行以下代码来安装Django: pip install django Step 2. 创建Djan…

    Django 2023年5月16日
    00
  • 关于Django的序列化问题。serializers

      在DRF框架里,ModelSerializers是一个重要的组件。大大的帮组我们节省了数据序列化的过程,真的可以说是良心产品。接手的这个项目用的Django,前人的代码都是手动序列化的,为了保证风格的一致性我续写的代码也都是手动序列化。后来遇到一个问题:有个接口的查询结果是querySet里的数据有几千条,而且需要一次性返回,不能做分页处理。这一下几千条…

    Django 2023年4月15日
    00
  • 详解Django CBV基类View源码解析

    什么是Django CBV? Django CBV,即Django的基于类的视图(Class-based views),是Django框架中的一个重要组件之一。相比于FBV(函数视图),CBV更加面向对象,使得代码更加可复用、可维护、可扩展。CBV支持多种HTTP请求方法,如GET、POST、PUT、DELETE等。 Django CBV中的基类View D…

    Django 2023年3月12日
    00
  • Python之Django自动实现html代码(下拉框,数据选择)

      #模板   class IndexForm(forms.Form):   # 模板,用户提交的name和这里的变量名一定要是一致的.否则不能获取数据   user = forms.CharField(min_length=6, error_messages={‘required’: ‘用户名不能为空’, ‘min_length’: ‘用户名长度不能小于6…

    Django 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部