2012-03-15 14 views
6

Yeni kullanıcı sorusu: Bir parametreyi views.py yönteminde bir yöntemle kabul etmem gerekiyor ama bana sorun verdi.django formu: Parametreyi view.py'den formlara geçirme hatası veriyor

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

Ama django beni söyleyerek hata veren tutar:

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

ve forms.py içinde aşağıdaki formu tanımlanmıştır

: TemplateSyntaxError: Caught NameError while rendering: name 'myClient' is not defined (Bu hata olur görünümünde aşağıdaki snippet'iyle bir yöntem yarattı sorgulamada)

Korkarım ki burada aptalca bir şey olur, ama nedenini anlayamıyorum. Lütfen yardım edin, teşekkürler.

+0

Lütfen tüm geri izlemeyi gönderin. – jpic

+0

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

cevap

10

Biçimlendirmenizi doğru düzelttiğimi farz ederseniz, bir girinti sorununuz var demektir: prob, __init__'un dışında, dolayısıyla yerel myClient değişkenine erişemez.

Bununla birlikte, bu yöntemin içine getirirseniz, diğer iki sorun olduğu için hala çalışmayacaktır: ilk olarak, bir değişkene bir alan atamak onu formda ayarlamaz; ve ikinci olarak, choices özniteliği, yalnızca düz bir liste değil, 2-tupl listesi gerektirir. Tek ihtiyacın şudur:

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

Açıkçası seçimler görüntülenen istediğiniz gerçek alanıyla MY_DESCRIPTIVE_FIELD değiştirin.