Python 如何强制清理一个字段并在Django中重新显示它?

Python 如何强制清理一个字段并在Django中重新显示它?,python,django,Python,Django,如何清理表单中的数据并重新显示清理后的数据而不是提交的数据 我的表单中有几个字段,每次用户提交时,都应该使用用户输入的值重新显示。但是,我希望为用户清理和更新一些字段。更具体地说,我有一个字段FriendlyIntegerField(forms.CharField),其中我覆盖到_python,不仅调用int(str(value)),还将任何负数设置为0等。我不想用无效数据重新显示表单,让用户自己修复它(Django希望我这样做) 清理数据并将其用于视图函数的其余部分没有问题,但是如何使用此数据

如何清理表单中的数据并重新显示清理后的数据而不是提交的数据

我的表单中有几个字段,每次用户提交时,都应该使用用户输入的值重新显示。但是,我希望为用户清理和更新一些字段。更具体地说,我有一个字段
FriendlyIntegerField(forms.CharField)
,其中我覆盖
到_python
,不仅调用
int(str(value))
,还将任何负数设置为0等。我不想用无效数据重新显示表单,让用户自己修复它(Django希望我这样做)

清理数据并将其用于视图函数的其余部分没有问题,但是如何使用此数据更新实际表单

顺便说一下,表单没有反映我的数据模型中的结构,因此继承自
表单
,而不是
模型表单

编辑:

我的字段(精简版)如下所示:


类友好整数字段(forms.CharField):
定义到python(自身,值):
尝试:
返回str(int(str(value).replace(“”,,))
除:
raise forms.ValidationError('some error msg')

我的表单(精简版)如下所示:

类搜索表单(forms.Form):
price\u from=FriendlyIntegerField()
price\u to=FriendlyIntegerField()

我的看法是:

def搜索(请求、密钥):
如果request.method==“POST”:
表单=搜索表单(request.request)
如果不是表单,则表单是否有效()
打印“表格无效”
其他:
form=SearchForm()
返回render_to_响应('path_to_template',{'form':form}

如果在使用
is\u valid()
清理表单后,使用视图呈现清理后的表单,而不是重定向到新页面,则会在页面中看到清理后的数据


(如果您希望用户查看此已清理数据,然后正确提交,则可以使用隐藏字段跟踪表单数据是否已清理,但这并非没有复杂性…)

作为旁注,您应该注意这一点。我记不起在哪里读过它,但显然更改用户输入的值可能会让最终用户感到困惑。只需告诉他们不允许使用负值并重新显示它们的值(错误)事实证明,输入比您想象的更加用户友好。我完全同意自助洗衣店的说法。无声地更改用户输入通常不是一个好主意。负数可能不是最好的例子,我可能会在最终版本中跳过它。但是,我确实想删除数字中的空格。该字段代表一个价格,我认为这是正确的自动将“250000”更改为“250000”是个好主意。您确定重新显示表单时应该呈现已清理的数据,而不是原始数据吗?我已经发布了上面代码的精简版本,如果您能看一看并检查一下是否可以看到未呈现已清理数据的原因,我将不胜感激。例如,如果我输入一个带有空格的数字,如“42 43”,根据您在这里所说的,我希望它呈现为“4243”,但它仍然呈现为“42 43”,请在clean_foo(self)方法中修复它,并记住在结束时返回您的已清理值。如果您想要清理数据(并显示清理效果),那么对_python进行黑客攻击是不合适的好的,我改为使用常规的CharField,并在SearchForm.clean_price_from()中进行清理,它返回清理后的值。我的视图与上面的视图相同,只是我记录了form.cleaned_数据['price_from']就在“else”之前。记录的数据被清除,重新显示的表单没有。另外,浏览Django的源代码,似乎并不意味着应该重新显示清除的数据。这是我对Django/form/forms.py的理解:绑定表单有一个BoundField,它是从表单的原始字段初始化的。当BoundFields呈现时,用作值的数据是从原始字段中的datadict提取的,而不是从self.cleaned_数据提取的。我也看不到原始字段在任何地方从self.cleaned_数据更新。@knatten您是对的,您可以找到解决方法 class FriendlyIntegerField(forms.CharField): def to_python(self, value): try: return str(int(str(value).replace(' ',''))) except: raise forms.ValidationError('some error msg') class SearchForm(forms.Form): price_from = FriendlyIntegerField() price_to = FriendlyIntegerField() def search(request, key): if request.method == 'POST': form = SearchForm(request.REQUEST) if not form.is_valid(): print "Form not valid" else: form = SearchForm() return render_to_response('path_to_template', {'form' : form}