Python 如何正确覆盖clean()方法

Python 如何正确覆盖clean()方法,python,django,django-forms,clean-urls,django-1.8,Python,Django,Django Forms,Clean Urls,Django 1.8,我正在尝试Tango With Django教程,clean()方法中的覆盖无法在我的URL中添加“http://”。这个代码有什么问题 forms.py class PageForm(forms.ModelForm): ... def clean(self): cleaned_data = self.cleaned_data url = cleaned_data.get('url') if url and not url.s

我正在尝试Tango With Django教程,clean()方法中的覆盖无法在我的URL中添加“http://”。这个代码有什么问题

forms.py

class PageForm(forms.ModelForm):

    ...

    def clean(self):
        cleaned_data = self.cleaned_data
        url = cleaned_data.get('url')

        if url and not url.startswith('http://'):
            url += 'http://'
            cleaned_data['url'] = url

        return cleaned_data
views.py

def add_page(request, category_name_slug):

    try:
        cat = Category.objects.get(slug=category_name_slug)
    except Category.DoesNotExist:
        cat = None

    if request.method == 'POST':
        form = PageForm(request.POST)
        if form.is_valid():
            if cat:
                page = form.save(commit=False)
                page.category = cat
                page.views = 0
                page.save()
                return category(request, category_name_slug)
        else:
            print(form.errors)
    else:
        form = PageForm()

    context_dict = {'category': cat, 'form': form}

    return render(request, 'rango/add_page.html', context_dict)
add_page.html

{% extends "base.html" %}

{% block title %}Add Page{% endblock title %}

{% block content %}
    <h1>Add a Page</h1>
    <form id='page_form' method='post' action="">
        {% csrf_token %}
        {% for hidden in form.hidden_fields %}
            {{ hidden }}
        {% endfor %}

        {% for field in form.visible_fields %}
            {{ field.errors }}
            {{ field.help_text }}
            {{ field }}
        {% endfor %}
        <input type="submit" name="submit" Value="Create Page" />
    </form>
{% endblock content %}
{%extends“base.html”%}
{%block title%}添加页面{%endblock title%}
{%block content%}
添加页面
{%csrf_令牌%}
{%用于隐藏在表单中。隐藏的_字段%}
{{隐藏}}
{%endfor%}
{%form.visible_fields%}
{{field.errors}}
{{field.help_text}
{{field}}
{%endfor%}
{%endblock内容%}
管理员工作正常,但html本身不接受这种书写方式。

您需要:

def clean(self):
    cleaned_data = super(PageForm, self).clean() # <-----------
    url = cleaned_data.get('url')
    if url and not url.startswith('http://'):
        url += 'http://'
        cleaned_data['url'] = url
    return cleaned_data
def清洁(自清洁):

cleaned_data=super(PageForm,self).clean()#通常,由于您只清理一个字段,因此应使用特定于字段的方法清理url

def clean_url(self):
    url = self.cleaned_data['url']
    # your cleaning here
    return url

它仍然不起作用,当我尝试添加像“www.google.com”这样的URL时,它仍然会给我一条消息“请输入URL”@ArrowsX如果您在模型级别使用URL字段,它将进行验证,并给您表单验证错误以添加“http://”作为有效URL。至于覆盖完整的clean方法只是验证一个字段并不像django那样,而是使用clean_url(self)@doniyor
ModelForm.clean()
只启用唯一性验证并返回
self.cleaned_数据
。虽然应该调用它是正确的,但它无法解决此问题。我是否仍要覆盖clean方法?我如何在views.py中调用它?只需添加概述的clean_url(),而不是原始的clean()。作为一条规则:只处理一个字段的清理应该进入特定于字段的方法,涉及多个字段的清理应该进入clean()。调用is\u valid()时,将触发表单验证。@kaveman>能否在
clean()
的开头插入一个断点,并检查
self.cleaned\u数据
self.errors
的内容?我打赌url不在前者中,但错误消息已经在后者中。