django form: передача параметра из view.py в формы выдает ошибку - PullRequest
8 голосов
/ 15 марта 2012

Вопрос новичка: Мне нужно принять параметр в форме из метода в 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 Ответ

10 голосов
/ 15 марта 2012

Если я правильно исправил форматирование, у вас есть проблема с отступом: prob находится вне __init__, поэтому не имеет доступа к локальной переменной myClient.

Однако если выперенести его внутрь метода, он все равно не будет работать, так как есть две другие проблемы: во-первых, простое назначение поля переменной не установит его в форме;и во-вторых, атрибуту choices нужен список из двух кортежей, а не просто плоский список.Что вам нужно, это:

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 на фактическое поле, которое вы хотите отобразить в вариантах.

...