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

我对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),是通过编写shellpy manage.py ikelti_DRG --path path/to/your/file.csv激活的

导入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,**kwargs):
        with open(data_file) as f:
            reader = csv.reader(f,)

最后,我修改了DRGkodas中已注册的admin.py模块,以包括如下新动作:

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)

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

我的主要问题是什么-正确的方法?起初,我以为我应该在管理页面上放置按钮,但是经过一番研究后,我发现关于如何去做。因此,我尝试将动作直接添加到模型中(上面的代码),但这与我需要的工作有点不同。

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

uerk123 回答:从管理页面运行自定义脚本(以从CSV填充模型)

要执行此类操作,请使用管理员中的按钮。为此,请覆盖响应核心的管理模板(例如,如果要在顶部放置按钮,请输入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"),
本文链接:https://www.f2er.com/3104196.html

大家都在问