2014-10-29 58 views
1

我花了很多時間試圖找出爲什麼下面的代碼不正常工作。我搜索了SO,Python文檔& Google,並閱讀了django文檔,但我仍然無法弄清楚爲什麼它不起作用。django namedtuple不返回值

基本上,我有一個存儲所需字段數據的命名元組。然後,我想調用指定的元組來清除表單中的數據,然後將條目保存/更新到數據庫。

例如,當用戶選擇的address_type爲6時,LocalityDisplay爲False。然後在表單的驗證中,如果atype_config.LocalityDisplay == False:應該被觸發,並且address_locality中的值應該被移除,這意味着沒有值應該被保存到數據庫的address_locality。我已經使用返回value.strip()其他在我的forms.py中,它運作良好。

我不確定我是否已經在編碼命名的元組造成命名元組做了一個根本性的錯誤不能被正確索引,或者如果我已經編寫了如果atype_config.LocalityDisplay ==錯誤:錯誤條件或取得了一些其他錯誤我看不到。

沒有顯示錯誤,如果atype_config.LocalityDisplay == False:顯示沒有被觸發/到達。

這裏是我的代碼:

forms.py

from collections import namedtuple 

RequiredFields = namedtuple('RequiredFields', ['LocalityDisplay', 'LocalityRequired', 'RegionDisplay', 'RegionRequired', 'PostcodeDisplay', 'PostcodeRequired']) 

........... (do some stuff here) 

class AddressDetailsForm(forms.ModelForm): 

........... (do some stuff here) 

REQUIRED_FIELDS = { 
    0: RequiredFields(LocalityDisplay=True, LocalityRequired=False, RegionDisplay=True, RegionRequired=False, PostcodeDisplay=True, PostcodeRequired=False), 
    1: RequiredFields(LocalityDisplay=False, LocalityRequired=False, RegionDisplay=True, RegionRequired=True, PostcodeDisplay=True, PostcodeRequired=True), 
    2: RequiredFields(LocalityDisplay=True, LocalityRequired=True, RegionDisplay=False, RegionRequired=False, PostcodeDisplay=True, PostcodeRequired=True), 
    3: RequiredFields(LocalityDisplay=True, LocalityRequired=True, RegionDisplay=False, RegionRequired=False, PostcodeDisplay=True, PostcodeRequired=True), 
    4: RequiredFields(LocalityDisplay=True, LocalityRequired=True, RegionDisplay=False, RegionRequired=False, PostcodeDisplay=True, PostcodeRequired=True), 
    5: RequiredFields(LocalityDisplay=True, LocalityRequired=True, RegionDisplay=True, RegionRequired=True, PostcodeDisplay=True, PostcodeRequired=True), 
    6: RequiredFields(LocalityDisplay=False, LocalityRequired=False, RegionDisplay=True, RegionRequired=True, PostcodeDisplay=True, PostcodeRequired=True), 
    ........... (culled for brevity) 
    285: RequiredFields(LocalityDisplay=True, LocalityRequired=True, RegionDisplay=False, RegionRequired=False, PostcodeDisplay=False, PostcodeRequired=False) 
} 

........... (do some stuff here) 

cd_addf = super(AddressDetailsForm, self).clean() 
    address_type = cd_addf.get('address_country_style_type', None) 
    if address_type is None: 
     # Prior validation will spot this 
     pass 
    elif address_type == 0: 
     self._errors['address_country_style_type'] = self.error_class([_("You must select an Address Format.")]) 
    else: 
     atype_config = REQUIRED_FIELDS[address_type] 

     ........... (do some stuff here) 

     if atype_config.LocalityDisplay == False: 
      def clean_address_locality(self): 
       value = self.cleaned_data['address_locality'] 
       return value.strip() 

     ........... (do some stuff here) 

    return cd_addf 

我問一個相關的問題here,但並沒有解決問題,所以我不知道是什麼原因延誤?代碼不起作用。

+0

你確定'''address_type'''不是'''''''''''''''''''''''''''''''''''''' – schillingt 2014-10-30 00:33:51

+0

schillingt,我通過刪除if else條件並只有if atype_config.LocalityDisplay == False:條件來查看該條。問題仍然存在。 – user1261774 2014-10-30 00:49:33

+0

您是否嘗試添加一些日誌記錄以查看執行的執行情況與預期不符? – 2014-10-30 03:35:07

回答

1

這似乎與您的namedtuple沒有任何關係。如果您按照評論中的建議添加了一些日誌記錄,那麼您可以看到這一點。問題完全在於如果聲明,代碼根本沒有意義。

首先,正如你在其他問題中詳細解釋的那樣,strip不會做你認爲它確實會做的事情。它返回的值是空白空白。如果你想讓你的clean函數返回None,那麼只需返回None,不要使用strip。其次,更重要的是,在另一個方法內的if語句中定義一個函數是完全沒有意義的。 Django無法知道任何有關新方法的信息,您無法從外部調用另一個函數中定義的函數,即使Django在調用主要的clean方法時已經完成了clean_fieldname函數。

但是在任何情況下都是毫無意義的;您可以訪問clean方法中的cleaned_data字典,那麼爲什麼不簡單地刪除那裏的元素呢?

if not atype_config.LocalityDisplay: 
    self.cleaned_data.pop('address_locality', None)