django形式:绑定表单的默认值

cli*_*ime 7 forms django

使用此表单:

class Form(forms.Form):
    name = forms.CharField(required=False, initial='Hello world')
Run Code Online (Sandbox Code Playgroud)

如果我在视图中执行以下操作:

form = Form(request.GET)
if form.is_valid():
    name = form.cleaned_data['name']
Run Code Online (Sandbox Code Playgroud)

然后,即使request.GET不包含name键,也会丢失name的初始值.有没有解决方法?我希望初始值可以将表单绑定为"默认值".

cli*_*ime 9

通过略微修改Gonzalo的解决方案,这是正确的方法:

class Form(forms.Form):
    name = forms.CharField(required=False, initial='Hello world')

    def clean_name(self):
        if not self['name'].html_name in self.data:
            return self.fields['name'].initial
        return self.cleaned_data['name']
Run Code Online (Sandbox Code Playgroud)

如果你需要这个,你可以看看django-filter app.我最近才发现它.


Gon*_*alo 5

initial实际上并不意味着用于设置表单字段的默认值.相反,在向用户显示表单时,它实际上更像是一个占位符实用程序,如果不需要该字段,则无法正常工作(如示例所示).

你可以做的是定义一个clean_<fieldname>方法,检查该字段是否有空值并返回默认值:

class Form(forms.Form):
    name = forms.CharField(required=False, initial='Hello world')

    def clean_name(self):
        name = self.cleaned_data['name']
        if name is None:
            return self.fields['name'].initial
        return name
Run Code Online (Sandbox Code Playgroud)