【问题标题】:Runing custom script (to populate model from CSV) from admin page从管理页面运行自定义脚本(从 CSV 填充模型)
【发布时间】:2020-03-10 03:51:30
【问题描述】:

我对 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.csvshell 激活

导入 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)

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

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

请给我一些关于我应该使用什么方法的建议,任何文献或示例代码 sn-p 将不胜感激

【问题讨论】:

    标签: python django django-models django-admin django-admin-actions


    【解决方案1】:

    要执行此类操作,我会使用管理员中的按钮。为此,请覆盖相应的管理模板(例如 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"),
    

    【讨论】:

    • 这正是我想要达到的结果,但不知道从哪里开始以及如何开始!如果可以的话,我会两次投票赞成您的答案!现在我知道要寻找什么,阅读更多文献并看到未来更新的巨大潜力。谢谢。
    猜你喜欢
    • 2020-07-15
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2010-10-11
    • 2017-12-01
    • 2011-12-28
    • 1970-01-01
    • 2019-04-08
    相关资源
    最近更新 更多