繁体   English   中英

django namedtuple不返回值

[英]django namedtuple not returning value

我花了很多时间试图弄清楚为什么以下代码无法正常工作。 我已经搜索过SO,Python文档和Google,并阅读了django文档,但是我仍然无法弄清为什么它不起作用。

基本上,我有一个存储所需字段数据的命名元组。 然后,我想调用命名的元组,以在将条目保存/更新到数据库之前清除表单中的数据。

例如,当用户选择的address_type为6时,LocalityDisplay为False。 然后在表格的验证, 如果atype_config.LocalityDisplay ==错误:应该跳闸并在address_locality的价值应该被删除,这意味着没有vaule应该被保存到数据库中的address_locality。 我在我的forms.py中使用过return value.strip() else,并且效果很好。

我不确定在对命名元组进行编码时是否犯了基本错误,导致命名元组无法正确索引,或者我是否对if atype_config.LocalityDisplay == False进行了编码条件错误或出现了其他我看不到的错误。

如果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

在这里问了一个相关的问题,但是没有解决问题,所以我不确定代码无法正常工作的原因是什么。

这似乎与您的namedtuple没有任何关系。 如果您按照注释中的建议添加一些日志记录,那么您将能够看到它。 问题完全在if语句内,其中代码根本没有意义。

首先,正如您在其他问题中详细解释的那样, strip并没有按照您认为的做。 它返回的值将空格去除掉。 如果您希望clean函数返回None,则仅返回None,请不要使用strip。

其次,更重要的是,在另一个方法的if语句中定义一个函数完全没有意义。 Django对您的新方法一无所知,您无法从外部调用另一个函数内部定义的函数,即使Django在调用main clean方法时就已经完成了clean_fieldname函数。

但是无论如何,这一切都是毫无意义的。 您已经可以使用clean方法访问cleaned_data词典,那么为什么不简单地删除那里的元素呢?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM