繁体   English   中英

Django-使用视图中的参数调用命令行

[英]Django - Call command line with arguments from view

我正在尝试调用从视图更改数据库的命令。 基本上,一旦视图被加载,参数就会改变。 如果我从终端运行命令,它会起作用,但是如果我尝试从视图中调用它,则会继续收到此错误。
我相信我通过字典的方式会有错误,因为该命令在终端上可以正常运行。 也可能是因为我正在尝试更新当前正在显示给用户的模型,但是我也尝试过传递不同的ID作为参数,这会引起相同的错误。

  CommandError at /sample/45/

Error: argument num: invalid int value: "{'num': 45}"

Request Method:     GET
Request URL:    http://127.0.0.1:8000/sample/45/
Django Version:     2.0
Exception Type:     CommandError
Exception Value:    

Error: argument num: invalid int value: "{'num': 45}"

Exception Location:     /usr/local/lib/python3.6/dist-packages/django/core/management/base.py in error, line 60
Python Executable:  /usr/bin/python3
Python Version:     3.6.5
Python Path:    

['/home/ander/Desktop/Proyecto/meduloblastoma/Code/MedulloblastomaProject',
 '/usr/lib/python36.zip',
 '/usr/lib/python3.6',
 '/usr/lib/python3.6/lib-dynload',
 '/usr/local/lib/python3.6/dist-packages',
 '/usr/lib/python3/dist-packages',
 '/home/ander/Desktop/Proyecto/meduloblastoma/Code/MedulloblastomaProject']

Server time:    Mon, 4 Jun 2018 18:35:37 +0200

这是我使用的代码。

分类

from django.core.management.base import BaseCommand
from rpy2.robjects.packages import importr
import rpy2.robjects as ro
from sample.models import Sample

class Command(BaseCommand):
    """
    Management command to run the classifier
    """
    def add_arguments(self, parser):
        parser.add_argument('num',type=int)

help="Runs the classifier on uploaded samples"

def handle(self,*Args,**Options):
    num=Options['num']
    samples=Sample.objects.filter(id=num)
    print(samples)
    for sample in samples:
        if sample.classificator=="Not classified":
            sample.classificator="Classified"

views.py

@login_required
def detail_sample(request, id):
    instance = get_object_or_404(Sample, id=id)
    call_command('classify', {'num': instance.id})
    if instance.user == request.user:

        if instance.allow:
            agreed="This data is allowed to be used for improvement of the algorithm"
        else:
            agreed="This data is NOT allowed to be used for improvement of the algorithm"

    context={
        "title": instance.title,
        "user":instance.user.username,
        "comment": instance.comment,
        "time": instance.time,
        "diagnosis": instance.diagnosis,
        "gender": instance.gender,
        "file1": instance.file1,
        "file2":instance.file2,
        "id": instance.id,
        "a":instance.classificator, #a[0][2:],
        "b":instance.classificator, #a[1][0],
        "agree":agreed,
        "allow":instance.save,
    }
    return render(request, "sample/sample_detail.html", context)
else:
    raise Http404

您应该将num作为关键字参数传递:

call_command('classify', num=instance.id)

但是,将代码分解为单独的方法可能更好。

def classify(num):
    samples=Sample.objects.filter(id=num)

    for sample in samples:
        if sample.classificator=="Not classified":
            sample.classificator="Classified"

然后,您的管理命令和视图都可以调用classify(num) ,而不必使用call_command

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM