从管理页面运行自定义脚本(从 CSV 填充模型)

Runing custom script (to populate model from CSV) from admin page

我是 django 的新手,需要帮助和想法才能找到正确的方法。简而言之,我有一个模型,每年从 CSV 文件中填充几次(删除所有信息并将其替换为新的表单文件)。为此 - 我编写了来自 shell 的 运行 脚本。它有效,但不方便,我不能让别人去做。我想升级并使该脚本可从 admin 页面调用。这是到目前为止的结果:

为了上传 CSV 文件,我为其创建了模型(在 models.py 中):

class DrgDuomenys(models.Model):

    drg_duomenys = models.FileField(upload_to='DRG_csv/')
    data = models.DateField(auto_now=False, auto_now_add=True)

应填充的型号(也在 models.py 中):

class DRGkodas(models.Model):

    drg_kodas = models.CharField(max_length=4)
    drg_koeficientas = models.DecimalField(max_digits=6, decimal_places=3)
    drg_skaicius = models.IntegerField()

    def __str__(self):
        return self.drg_kodas

用于填充模型的旧脚本(名为 ikelti_drg.py),通过编写 py manage.py ikelti_DRG --path path/to/your/file.csv

shell 激活

导入 csv 来自 django.core.management 导入 BaseCommand 来自 stv.models 导入 DRGkodas、DrgDuomenys

class Command(BaseCommand):

    def add_arguments(self, parser):
        parser.add_argument('--path', type=str)

    def handle(self, *args, **kwargs):
        path = kwargs['path']
        with open(path, 'rt') as f:
            reader = csv.reader(f, dialect='excel')
            for row in reader:
                drg_kodai = DRGkodas.objects.create(
                    drg_kodas = str(row[0]),
                    drg_koeficientas = float(row[1]),
                    drg_skaicius = int(row[2]),
                )

我尝试编辑它以使用数据库中的 CSV 来简化流程,所以我编辑的脚本应该可以从 admin 页面调用(可能不正确,所以这里的任何帮助也将不胜感激):

import csv
from django.core.management import BaseCommand
from stv.models import DRGkodas, DrgDuomenys

class LoadDrg(BaseCommand):
    #Load DRG duomenų csv file into the database

    data = DrgDuomenys.objects.latest('data')
    data_file = data.drg_duomenys 

    def handle(self, *args, **kwargs):
        with open(data_file) as f:
            reader = csv.reader(f, dialect='excel')
            for row in reader:
                drg_kodai = DRGkodas.objects.create(
                    drg_kodas = str(row[0]),
                    drg_koeficientas = float(row[1]),
                    drg_skaicius = int(row[2]),
                )

最后,我在 admin.py 中修改了已注册的 DRGkodas 模块,以包含像这样的新烘焙操作:

from stv.management.commands.ikelti_DRG_admin import LoadDrg
class DRGkodaiAdmin(admin.ModelAdmin):
    list_display = ('drg_kodas', 'drg_koeficientas', 'drg_skaicius')
    actions = ['paskelbti_drg_info',]

    def paskelbti_drg_info(self, request):
        uzpildyti_drg = [LoadDrg]
    paskelbti_drg_info.short_description = "Upload new info"   
admin.site.register(DRGkodas, DRGkodaiAdmin)

现在的问题是,要调用操作我必须至少选择一个条目(并且应该有 none,因为我正在尝试创建它们)如果我创建虚拟条目并选择它使命令 运行,它(显然)不起作用。

我的主要问题是什么 - 正确的做法? 起初我想我应该把按钮放在管理页面的某个地方,但经过一些研究我没有找到关于如何做到这一点的任何可靠信息。所以我尝试直接向模型添加动作(我上面的代码),但工作方式与我需要的有点不同。

请给我一些关于我应该使用什么方法的建议,也非常感谢任何文献或示例代码片段

为了执行这些操作,我使用了管理员中的一个按钮。为此,请覆盖对应的管理模板(例如 base_site.html 如果您想要顶部的按钮)并在其中添加类似的内容:

<form action="/action_view" style="display:inline-block;">
    <input type="submit" value="Upload Data" />

</form>

然后创建 action_view 并将其与 url 中的函数连接起来。

views.py:

def action_view(request):
    with open(data_file) as f:
        reader = csv.reader(f, dialect='excel')
        for row in reader:
            drg_kodai = DRGkodas.objects.create(
                drg_kodas = str(row[0]),
                drg_koeficientas = float(row[1]),
                drg_skaicius = int(row[2]),
            )

添加到 url.py:

url(r'^action_view/$', action_view, name="action_view"),