【问题标题】:django form: Passing parameter from view.py to forms gives out errordjango 表单:将参数从 view.py 传递到表单会出错
【发布时间】:2012-04-01 04:21:19
【问题描述】:

新手问题: 我需要从views.py中的方法接受表单中的参数,但这给我带来了麻烦。在视图中,我使用以下 sn-p 创建了一个方法:

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(这个错误发生在查询中)

我担心这里缺少一些愚蠢的东西,但我无法真正弄清楚为什么。请帮忙,谢谢。

【问题讨论】:

标签: django forms parameter-passing


【解决方案1】:

假设我已正确更正了您的格式,您有缩进问题: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 替换为您希望在选项中显示的实际字段。

【讨论】:

    猜你喜欢
    • 2014-08-09
    • 2012-03-13
    • 2020-04-13
    • 1970-01-01
    • 2018-05-28
    • 2013-01-17
    • 2019-01-21
    • 2020-06-09
    • 2016-01-13
    相关资源
    最近更新 更多