django form:将参数从view.py传递给表单会发出错误

时间:2012-03-15 15:57:36

标签: django forms parameter-passing

新手问题: 我需要从views.py中的方法接受表单中的参数,但它给了我麻烦。在视图中,我创建了一个包含以下代码段的方法:

def scan_page(request):
    myClient = request.user.get_profile().client
    form = WirelessScanForm(client = myClient)   # pass parameter to the form

在forms.py中我定义了以下形式:

class WirelessScanForm(forms.ModelForm):
    time = forms.DateTimeField(label="Schedule Time", widget=AdminSplitDateTime())

    def __init__(self,*args,**kwargs):
        myClient = kwargs.pop("client")     # client is the parameter passed from views.py
        super(WirelessScanForm, self).__init__(*args,**kwargs)
        prob = forms.ChoiceField(label="Sniffer", choices=[ x.sniffer.plug_ip for x in Sniffer.objects.filter(client = myClient) ])

但是django一直给我错误说:TemplateSyntaxError: Caught NameError while rendering: name 'myClient' is not defined(查询中会出现此错误)

我担心这里会有一些愚蠢的东西,但我无法弄明白为什么。请帮助,谢谢。

1 个答案:

答案 0 :(得分:10)

假设我已正确更正了您的格式,则会出现缩进问题:prob__init__之外,因此无法访问本地myClient变量。

但是如果你把它放在方法中,它仍然无法工作,因为还有另外两个问题:首先,简单地为变量分配一个字段不会在表单上设置它;第二,choices属性需要一个2元组列表,而不仅仅是一个平面列表。你需要的是:

def __init__(self,*args,**kwargs):
    myClient = kwargs.pop("client")     # client is the parameter passed from views.py
    super(WirelessScanForm, self).__init__(*args,**kwargs)
    self.fields['prob'] = forms.ChoiceField(label="Sniffer", choices=[(x.plug_ip, x.MY_DESCRIPTIVE_FIELD) for x in Sniffer.objects.filter(client = myClient)])

显然将MY_DESCRIPTIVE_FIELD替换为您希望在选项中显示的实际字段。