在django中选择特定表格

时间:2015-07-08 10:55:31

标签: python django forms

我不知道我是否能做到,但我接下来要尝试的是:

我有一个模特'服务'它有一些字段,如: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)

提前致谢

2 个答案:

答案 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})