新手问题: 我需要从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
(查询中会出现此错误)
我担心这里会有一些愚蠢的东西,但我无法弄明白为什么。请帮助,谢谢。
答案 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
替换为您希望在选项中显示的实际字段。