获取一个django textfeild作为代码运行



我正在尝试启动一个项目,我正在使用Django来完成它。我在模型start_lines = models.TextField(blank=True, null=True)中有一个属性。这些行是为了让代码从exec()函数开始。作为其中之一,我有

from .code.Lot_sizing_codes import lot_size
ls = lot_size(K, h, r, True)
output, extra_output = (ls.{str(Functions.objects.get(id=request.POST["function_to_call"]))}({request.POST["inputExtras"]}))

我必须运行这个贯穿函数来呈现我想要的东西:

def showProgramX(request, pk):
program = Program.objects.get(id=pk)
form = ProgramInputForm()
keys = ""
vars = []
for var in program.inputvariables.split(","):
var_name, var_type = var.split("=")
keys += f"""
<tr>
<th><label for="{var_name}">{var_name}:</label></th>
<td><input type="text" name="{var_name}" maxlength="1000" class="input" id="id_inputvariables"></td>
</tr>"""
vars.append(var_name)
content = {"program": program, "form": form, "keys": keys}
if request.method == "POST":
form1 = ProgramInputForm(request.POST)
import json
req = request.POST
for var in vars:
line = f"""{var} = {req[f'{var}']}"""
exec(line, globals())

exec(program.start_lines, globals())
content["output"] = output
content["extra_output"] = extra_output
content['form'] = form1
return render(request, "programs/program.html", content)

如果我打印program.start_lines,则输出应为在这种情况下{str(Functions.objects.get(id=request.POST["function_to_call"](}=all并且{request.POST["inputExtras"]}为空

from .code.Lot_sizing_codes import lot_size
ls = lot_size(K, h, r, True)
output, extra_output = (ls.all())

当我真正得到时

from .code.Lot_sizing_codes import lot_size
ls = lot_size(K, h, r, True)
output, extra_output = (ls.{str(Functions.objects.get(id=request.POST["function_to_call"]))}({request.POST["inputExtras"]}))

有人知道我能做些什么吗?我已经尽力了。

我明白了。所以现在只是分享知识。

我使用的模板灵感来自https://realpython.com/python-string-formatting/

from string import Template 
t = Template(program.start_lines)
print(t.substitute(function =str(Functions.objects.get(id=request.POST["function_to_call"])), argskwargs=request.POST["inputExtras"] ))

并将以下内容放入文本字段

from .code.Lot_sizing_codes import lot_size
ls = lot_size(K, h, r, True)
output, extra_output = (ls.$function($argskwargs))

最新更新