【问题标题】:Cleaning data which is of type URLField清理 URLField 类型的数据
【发布时间】:2011-04-08 21:07:45
【问题描述】:

我的模型中有一个简单的 URLField

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

我想从字段中删除前导和尾随空格。我不认为我可以在“clean_fieldname”或“clean”方法中做到这一点。

我是否需要对“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)

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    我做了一个快速实验,发现您确实可以使用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”。我编辑了我的问题并包含了有问题的模型和表单。

    我确认您的表单类确实给出了错误。

    在做了一个小改动之后,我就可以让它工作了。我所做的只是删除了自定义的 titlelink 字段。我们在这里使用模型表单,并且底层模型已经具有这些字段。我相信重新定义会导致在调用自定义清理方法之前引发验证错误。

    class StoryForm(forms.ModelForm):
        class Meta:
            model = Story
            fields = ('title', 'link')
    
        def clean_link(self):
            link = self.cleaned_data['link']
            return link.strip()
    

    以下是 shell 的一些示例输出:

    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>
    

    【讨论】:

    • 嗯,这个解决方案对我不起作用。我收到一条错误消息,提示“输入一个有效的链接,如 www.ted.com”。我编辑了我的问题并包含了有问题的模型和表格。这可能与版本有关吗?我正在使用 python 2.6.1 和 django 1.2.1。
    • 谢谢 Manoj。我再次声明标题和链接字段的唯一原因是提供自定义错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多