2

我正在阅读 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>

作为一种解决方法,我已经根据forms.py url官方 Django 文档调整了函数以这种方式工作,尽管这不是我的首选方法:

url = forms.URLField(
    max_length=200, help_text="input page URL", initial='http://')
4

3 回答 3

7

我也有这个问题。我的问题是在输入缺少的 url 字符串时不断显示一个弹出窗口http://,说“请输入一个 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

于 2014-11-21T15:55:58.200 回答
0

如果要确保表单中 url 字段中的输入值在保存时应具有前缀“http://”,无论用户是否输入,此行已经正确:

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

于 2014-03-12T09:28:48.660 回答
0

我想在这里添加另一个答案,这是我从丹尼尔的答案中学到

验证消息“请输入 URL”不是来自 Django。它来自试图在客户端验证它的浏览器(因为我认为在输入字段type中设置为)。"url"为了不让浏览器验证它,只需将novalidate属性放入表单中:

<form id="page_form" method="POST" ... novalidate>
于 2018-02-26T10:10:13.177 回答