V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Yunen
V2EX  ›  Python

问个小问题,关于 Django 的 Form 类

  •  
  •   Yunen · 2019-11-13 22:47:38 +08:00 · 2027 次点击
    这是一个创建于 1837 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Django 菜鸟问个关于 Form 类 Field 为空时默认值的问题。:) 例如:

    from django import forms
    
    class NewForm(forms.Form):
        name = forms.CharField(label='名称')
        age = form.IntegerField(
            label='年龄',
            required=False
    )
    def test(request):
        form = NewForm(request.POST)
        print(form.cleaned_data)   
    

    如果 Post 的数据为

    name=test&age=
    

    输出

    {'name':'test','age': None}
    

    请问有没有什么好的方法,能实现检测 age 是否存在,若不存在则设置为 defaultage 如:

    age = request.POST.get('age', defaultage)
    
    ManjusakaL
        1
    ManjusakaL  
       2019-11-13 23:19:09 +08:00
    Yunen
        2
    Yunen  
    OP
       2019-11-13 23:24:02 +08:00
    @ManjusakaL initial 并不能实现这个功能,只能是在 render 模板时给 field 的默认值。已测试过:( 感谢回复。
    676529483
        3
    676529483  
       2019-11-13 23:50:22 +08:00   ❤️ 1
    默认使用 empty_value,暂时只想到 2 种方法
    1、自己写自定义字段
    2、如果只是参数校验,不需要模版语言的话,改用其他验证插件,比如 pydantic、marshallow
    期待大佬更好的方法
    Yunen
        4
    Yunen  
    OP
       2019-11-14 00:11:24 +08:00
    @676529483 自己写字段有点麻烦(项目有多个 Form),插件的话没用过不知道:)
    我刚刚在研究了一下,决定在原 Form 的基础上重载他的 clean 函数,完美解决,代码如下:
    ```
    # 自定义基础类
    class BaseForm(forms.Form):

    # 重载 clean 方法
    def clean(self):
    # 遍历字典
    cleaned_data = {}
    for key, value in self.cleaned_data.items():
    if value == None:
    cleaned_data[key] = self.fields[key].initial
    else:
    cleaned_data[key] = value
    return cleaned_data
    ```
    其他 Form 类只需要继承这个类就好了
    例如上文的
    ```
    class NewForm(forms.Form):
    ...
    )
    改为
    class NewForm(BaseForm):
    ...
    )
    ```
    676529483
        5
    676529483  
       2019-11-14 00:13:28 +08:00
    @Yunen 额,我以前就这么干的,刚才试了下,这样写就行了
    ```python
    id = fields.CharField(empty_value="1", required=False)
    ```
    Yunen
        6
    Yunen  
    OP
       2019-11-14 00:26:31 +08:00
    @676529483 看了下文档,这个属性只有部分 Field 存在,而我这里主要是因为 IntegerField 字段的问题,而该字段无 empty_value 属性......感谢回复:)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2519 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:47 · PVG 23:47 · LAX 07:47 · JFK 10:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.