我不知道我是否能做到,但我接下来要尝试的是:
我有一个模特'服务'它有一些字段,如:name,help ..和一个associatedForm。我的想法是使用它来生成选择正确形式的服务接口。
这意味着要有这样的观点:
def serviceInterface(request):
if request.method == 'POST':
service = Service.objects.get(serviceName=request.POST.get('Name'))
form = service.associatedForm
return render(request, 'serviceInterface.html', {'name': service.name,'form': form})
当然,它不起作用,在表单模板中我只看到表单名称(serviceForm())但我想要的是选择我在forms.py中使用该名称的信息:< / p>
class serviceForm(forms.Form):
filename = forms.CharField(label='Filename', max_length=100)
parameter = forms.CharField(label='parameter', max_length=1)
parameter2 = forms.CharField(label='parameter2', max_length=1)
当然我知道我可以用Switch做例子并检查表单的名称等等,但是想法是做一些更自动的事情,比如创建一个新服务,只需在forms.py中定义表单并添加数据库中的信息
这可能吗?
这是我的模特服务:
class Service (models.Model):
name = models.CharField(max_length=30, null=False)
associatedForm = models.CharField(max_length=50, null=False)
提前致谢
答案 0 :(得分:2)
由于db的结果以字符串形式返回,因此您需要获取该对象。您要找的是getattr
:
def serviceInterface(request):
if request.method == 'POST':
service = Service.objects.get(name=request.POST.get('Name'))
selected_form = getattr(forms, service.associatedForm)
form = selected_form()
return render(request, 'serviceInterface.html', {'name': service.name,'form': form})
如果找不到指定的表单,我建议用getattr
包裹try/except
。如果找不到表单,也会有默认的返回/重定向。
希望这有帮助
请参阅docs
答案 1 :(得分:1)
创建所有表单,并使用表单创建字典 forms.py
from django import forms
class FormA(forms.Form):
filename = forms.CharField(label='Filename', max_length=100)
parameter = forms.CharField(label='parameter', max_length=1)
parameter2 = forms.CharField(label='parameter2', max_length=1)
class FormB(forms.Form):
filename = forms.CharField(label='Filename', max_length=100)
parameter = forms.CharField(label='parameter', max_length=1)
parameter2 = forms.CharField(label='parameter2', max_length=1)
class FormC(forms.Form):
filename = forms.CharField(label='Filename', max_length=100)
parameter = forms.CharField(label='parameter', max_length=1)
parameter2 = forms.CharField(label='parameter2', max_length=1)
class FormD(forms.Form):
filename = forms.CharField(label='Filename', max_length=100)
parameter = forms.CharField(label='parameter', max_length=1)
parameter2 = forms.CharField(label='parameter2', max_length=1)
views.py
您可以从POST获得的associatedForm,数据库
def serviceInterface(request):
associatedForm = "a" # get form name from data base
forms = {
"a":FormA(),
"b":FormB(),
"c":FormC(),
"d":FormD(),
}
form = forms[associatedForm]
# if request.method == POST:
return render(request,"add.html",{'form':form})