Очистка данных типа URLField - PullRequest
       8

Очистка данных типа URLField

1 голос
/ 06 сентября 2010

У меня есть простое поле URLField в моей модели

link = models.URLField(verify_exists = False, max_length = 225)

Я хотел бы убрать начальные и конечные пробелы с поля. Я не думаю, что я могу сделать это в «чистое_имя» или «чистый» метод.

Нужно ли подкласс "URLField" и удалить пробелы в методе to_python? Есть ли лучший способ сделать это без каких-либо подклассов?

Отредактированный

Это моя форма

class StoryForm(forms.ModelForm):

    title = forms.CharField(max_length=225, error_messages={'required' : 'Enter a title for the story'})
    link = forms.URLField(max_length=225, error_messages={'required' : 'Enter a link to the story', 'invalid' : 'Enter a valid link like www.ted.com'})

    class Meta:
        model = models.Story
        fields = ('title', 'link')

    def clean_link(self):
        link = self.cleaned_data['link']
        return link.strip()

и моя модель

class Story(models.Model):
    title = models.CharField(max_length = 225)
    link = models.URLField(verify_exists = False, max_length = 225)

1 Ответ

0 голосов
/ 06 сентября 2010

Я провел быстрый эксперимент и обнаружил, что вы действительно можете использовать метод clean_ для удаления начальных / конечных пробелов. Как то так:

# models.py
class UrlModel(models.Model):
    link = models.URLField(verify_exists = False, max_length = 225)

    def __unicode__(self):
        return self.link

# forms.py 
class UrlForm(ModelForm):
    class Meta:
        model = UrlModel

    def clean_link(self):
        link  = self.cleaned_data['link']
        return link.strip()

# shell
In [1]: from test_app.forms import UrlForm

In [2]: f = UrlForm(data = dict(link = '  http://google.com  '))

In [3]: f.is_valid()
Out[3]: True

In [4]: f.save()
Out[4]: <UrlModel: http://google.com>

Обновление

Я получаю сообщение об ошибке «Введите действительную ссылку, например, www.ted.com». Я отредактировал свой вопрос и включил соответствующую модель и форму.

Я проверил, что ваш класс формы выдает ошибку.

После внесения небольшого изменения я смог заставить его работать. Все, что я сделал, это удалил пользовательские поля title и link. Мы работаем с формой модели здесь, и базовая модель уже имеет эти поля. Я полагаю, что переопределение привело к ошибке проверки до пользовательского метода очистки.

class StoryForm(forms.ModelForm):
    class Meta:
        model = Story
        fields = ('title', 'link')

    def clean_link(self):
        link = self.cleaned_data['link']
        return link.strip()

Вот пример вывода из оболочки:

In [1]: from test_app.forms import StoryForm

In [2]: data = dict(title="Google story", link  = "   http://google.com ")

In [3]: f = StoryForm(data)

In [4]: f.is_valid()
Out[4]: True

In [5]: f.save()
Out[5]: <Story: Google story http://google.com>
...