0

我对 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用于填充模型的旧脚本(名为),shell通过写入激活py manage.py ikelti_DRG --path path/to/your/file.csv

从 django.core.management 导入 csv 从 stv.models 导入 BaseCommand 导入 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]),
                )

最后,我修改了已注册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)

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

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

请就我应该使用什么方法给我一些建议,任何文献或示例代码片段也将不胜感激

4

1 回答 1

2

要执行此类操作,我使用管理员中的按钮。为此,请覆盖相应的管理模板(例如,如果您想要顶部的按钮,则为 base_site.html)并添加如下内容:

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

</form>

然后创建 action_view 并将其与 url 中的函数挂钩。

视图.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"),
于 2019-11-14T11:07:41.537 回答