推荐学习书目
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 · Nov 13, 2019 · 2429 views
    This topic created in 2380 days ago, the information mentioned may be changed or developed.

    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  
       Nov 13, 2019
    Yunen
        2
    Yunen  
    OP
       Nov 13, 2019
    @ManjusakaL initial 并不能实现这个功能,只能是在 render 模板时给 field 的默认值。已测试过:( 感谢回复。
    676529483
        3
    676529483  
       Nov 13, 2019   ❤️ 1
    默认使用 empty_value,暂时只想到 2 种方法
    1、自己写自定义字段
    2、如果只是参数校验,不需要模版语言的话,改用其他验证插件,比如 pydantic、marshallow
    期待大佬更好的方法
    Yunen
        4
    Yunen  
    OP
       Nov 14, 2019
    @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  
       Nov 14, 2019
    @Yunen 额,我以前就这么干的,刚才试了下,这样写就行了
    ```python
    id = fields.CharField(empty_value="1", required=False)
    ```
    Yunen
        6
    Yunen  
    OP
       Nov 14, 2019
    @676529483 看了下文档,这个属性只有部分 Field 存在,而我这里主要是因为 IntegerField 字段的问题,而该字段无 empty_value 属性......感谢回复:)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2447 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 16:04 · PVG 00:04 · LAX 09:04 · JFK 12:04
    ♥ Do have faith in what you're doing.