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
这是我用过的代码。
classify.py
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
。
我正在尝试调用一个从视图更改数据库的命令。基本上,一旦视图被加载,参数就会改变。如果我 运行 来自终端的命令,它可以工作,但如果我尝试从视图中调用它,我会继续收到此错误。
我相信我传递字典的方式存在错误,因为命令在终端上运行良好。也可能是因为我正在尝试更新目前正在向用户显示的模型,但我也尝试将不同的 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
这是我用过的代码。
classify.py
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
。