我正在浏览Tango使用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://')
答案 0 :(得分:7)
我也有这个问题。我的问题是,当输入缺少http://
的网址字符串时,会不断显示弹出窗口,说&#34;请输入网址&#34;。所以clean()
来电永远不会有机会发生。
我认为这是因为表单中URLfield
的默认小部件会执行检查。通过执行以下操作,clean()代码有机会发生并添加最终丢失的&#34; http://&#34;
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
答案 1 :(得分:0)
如果您想确保表单中url字段中的输入值的前缀为&#34; http://&#34;当保存用户是否输入了该行时,该行已经正确:
url = forms.URLField(max_length=200, help_text="input page URL", initial='http://')
试试这个:
>>> from django import forms
>>> url = forms.URLField(initial='http://')
>>> print url.clean('google.com')
http://google.com/
无需在表单中实现clean()方法。
更新1:
在PageForm类中,您必须创建一个clean_url()方法,使用输入执行所需操作,并在save()方法中将已清理的数据分配给要保存的对象。提示:看看我的django表格forms.py
答案 2 :(得分:0)
我想在此处添加另一个答案,我从丹尼尔的回答中学到here
验证消息“请输入网址”是来自Django的 not 。它来自浏览器,它试图在客户端验证它(因为我认为type
在输入字段中设置为"url"
。要不让浏览器验证它,只需将novalidate
属性放在以下格式中:
<form id="page_form" method="POST" ... novalidate>