django 1.6自动从表单数据中删除或添加来自URLField的http://

use*_*169 2 django-forms django-views django-1.6

我正在阅读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')
Run Code Online (Sandbox Code Playgroud)

以下是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>
Run Code Online (Sandbox Code Playgroud)

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

url = forms.URLField(
    max_length=200, help_text="input page URL", initial='http://')
Run Code Online (Sandbox Code Playgroud)

小智 7

我也有这个问题.我的问题是,当输入丢失的网址字符串时,会不断显示弹出窗口,并显示http://"请输入网址".所以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)
Run Code Online (Sandbox Code Playgroud)

默认是 widget=UrlInput