2012-03-15 8 views
6

Domanda newbie: Ho bisogno di accettare un parametro in un modulo da un metodo in views.py ma mi ha dato problemi. Dal punto di vista ho creato un metodo con seguente frammento di codice:modulo django: il passaggio dal parametro view.py ai moduli restituisce l'errore

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

e nel forms.py ho definito il seguente modulo:

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) ]) 

Ma Django continua a darmi errore che dice: TemplateSyntaxError: Caught NameError while rendering: name 'myClient' is not defined (questo errore si verifica nella query)

Temo che sarebbe qualcosa di stupido che manca qui, ma non riesco davvero a capire perché. Per favore aiuto, grazie.

+0

Si prega di inviare il traceback completo. – jpic

+0

http://stackoverflow.com/questions/6993387/django-tables-caught-nameerror-while-rendering-global-name-name-is-not-defi –

risposta

10

Supponendo di aver corretto correttamente la formattazione, si è verificato un problema di indentazione: prob è all'esterno __init__, quindi non ha accesso alla variabile locale myClient.

Tuttavia, se lo si porta dentro il metodo, ancora non funzionerà, in quanto vi sono altre due questioni: in primo luogo, semplicemente assegnando un campo a una variabile non impostati sul modulo; e in secondo luogo, l'attributo choices ha bisogno di un elenco di tuple da 2, non solo di una lista piatta. Quello che vi serve è questo:

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)]) 

Ovviamente sostituire MY_DESCRIPTIVE_FIELD con il campo vero e proprio che si desidera visualizzare nelle scelte.

Problemi correlati