我正在阅读 Tango With Django 教程,我在表单章节 ( http://www.tangowithdjango.com/book/chapters/forms.html ) 中遇到了一个我无法开始工作的函数。
诚然,我正在使用 Python 3.3 和 Django 1.6 完成本教程,但是到目前为止我已经能够完成这些教程。
clean
函数 forms.py
应该清理 URLField:
class PageForm(forms.ModelForm):
title = forms.CharField(max_length=128, help_text="input page title")
url = forms.URLField(max_length=200, help_text="input page URL")
views = forms.IntegerField(widget=forms.HiddenInput(), initial=0)
def clean(self, cleaned_data):
cleaned_data = super(PageForm, self).clean()
url = cleaned_data.get('url')
if url and not url.startswith('http://'):
url = 'http://' + url
cleaned_data['url'] = url
return cleaned_data
class Meta:
model = Page
fields = ('title', 'url', 'views')
这是 add_page.html
模板的摘录:
<form id="page_form" method="POST" action="/rango/category/{{category_name_url}}/add_page/">
{% csrf_token %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in form.visible_fields %}
<p></p>
{{ field.errors }}
{{ field.help_text }}
{{ field }}
{% endfor %}
<p></p>
<input type="submit" name="submit" value="create page" />
<br>
</form>
作为一种变通方法,我根据官方 Django 文档调整了 forms.py
url
函数以这种方式工作,尽管这不是我的首选方法:
url = forms.URLField(
max_length=200, help_text="input page URL", initial='http://')
最佳答案
我也有这个问题。我的问题是,当输入缺少 http://
的 url 字符串时,会不断显示弹出窗口,提示“请输入 URL”。所以 clean()
调用从来没有机会发生。
我认为这是因为表单中 URLfield
的默认小部件执行检查。通过执行以下操作,clean() 代码有机会发生并添加最终丢失的“http://”
from django.forms.widgets import TextInput
...
url = forms.URLField(max_length=200,
help_text="Please enter the URL of the page.",
initial="http://",
widget=TextInput)
默认为widget=UrlInput
关于django-forms - django 1.6 自动删除或添加 http ://from URLField from form data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21923838/