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

2019-11-13 22:47:38 +08:00
 Yunen

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)
2044 次点击
所在节点    Python
6 条回复
ManjusakaL
2019-11-13 23:19:09 +08:00
Yunen
2019-11-13 23:24:02 +08:00
@ManjusakaL initial 并不能实现这个功能,只能是在 render 模板时给 field 的默认值。已测试过:( 感谢回复。
676529483
2019-11-13 23:50:22 +08:00
默认使用 empty_value,暂时只想到 2 种方法
1、自己写自定义字段
2、如果只是参数校验,不需要模版语言的话,改用其他验证插件,比如 pydantic、marshallow
期待大佬更好的方法
Yunen
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
2019-11-14 00:13:28 +08:00
@Yunen 额,我以前就这么干的,刚才试了下,这样写就行了
```python
id = fields.CharField(empty_value="1", required=False)
```
Yunen
2019-11-14 00:26:31 +08:00
@676529483 看了下文档,这个属性只有部分 Field 存在,而我这里主要是因为 IntegerField 字段的问题,而该字段无 empty_value 属性......感谢回复:)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/619320

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX