python - djangonamedtuple不返回值

标签 python django namedtuple

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

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

例如,当用户选择的address_type为6时,则LocalityDisplay为False。然后在表单验证中,应触发 if atype_config.LocalityDisplay == False: 并删除 address_locality 中的值,这意味着不应将 if atype_config.LocalityDisplay == False: 的值保存到数据库中强>地址地点。我在 forms.py 的其他地方使用了 return value.strip() 并且效果很好。

我不确定是否在编码命名元组时犯了根本性错误,导致命名元组无法正确索引,或者是否错误地编码了 if atype_config.LocalityDisplay == False: 条件或者犯了一些我看不到的其他错误。

没有显示错误,if 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 ,但没有解决问题,所以我不确定代码不起作用的原因是什么。

最佳答案

这似乎与您的命名元组没有任何关系。如果您按照评论中的建议添加一些日志记录,您就能够看到这一点。问题完全出在 if 语句中,其中的代码根本没有任何意义。

首先,正如您在其他问题中详细解释的那样,strip 并没有像您想象的那样做。它返回去掉末尾空格的值。如果您希望 clean 函数返回 None,则只需返回 None,不要使用 strip。

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

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

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

关于python - djangonamedtuple不返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26642134/

相关文章:

python - 在 Python 中将数据导入 Namedtuple

python - 如何使用python从linkedin下载图片?

django - 自动搭建Django开发环境

python - 如何使用 PyQt5 的 QWebEngineView 处理 "render"HTML

python - 在 DRF modelViewSet 上执行创建和更新的自定义函数

Django "group by"通过注释 : Get object from . value() 与 ID

python - 数据类与 typing.NamedTuple 主要用例

python - namedtuple 和 frozen dict 之间的区别

python - Yowsup WhatsApp 获取电话号码

python - 建立具有许多键但简单值的持久只读字典的有效方法