django 1.6 автоматически удаляет или добавляет http:// из URLField из данных формы

Я просматриваю учебники 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://')

person user1026169    schedule 21.02.2014    source источник


Ответы (3)


У меня тоже была эта проблема. Моя проблема заключалась в том, что при вводе строки 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

person sinopsychoviet    schedule 21.11.2014

Если вы хотите убедиться, что входное значение в поле 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. пи

person Ronnie Beltran    schedule 12.03.2014
comment
я хочу, чтобы он либо добавлял, либо удалял http:// в зависимости от того, был ли он частью пользовательского ввода. - person user1026169; 12.03.2014
comment
@user1026169 user1026169 так что вы имеете в виду, что когда пользователь ввел в форму с «example.com' в clean() вы удалите «http://», или когда пользователь введет в форму только «example.com», в методе clean () вы добавите «http://»? в чем смысл? что вы действительно хотите сделать со значением в поле URL? - person Ronnie Beltran; 13.03.2014
comment
если кто-то просто ставит example.com, я бы хотел, чтобы он стал http://example.com, если кто-то ставит http://example.com, я бы хотел, чтобы он оставался как есть. я не хочу, чтобы в поле URL уже был http://. - person user1026169; 14.03.2014

Я хотел бы добавить сюда еще один ответ, который я узнал из ответа Дэниела здесь

Сообщение проверки «Пожалуйста, введите URL» не исходит от Django. Это исходит от браузера, который пытается проверить его на стороне клиента (поскольку я думаю, что type установлен на "url" в поле ввода). Чтобы браузер не проверял его, просто поместите атрибут novalidate в форму:

<form id="page_form" method="POST" ... novalidate>
person Anupam    schedule 26.02.2018