Django form的cleaned_data的用法


我在学习推荐的 Tango or Django的教程

发现他用的是老版本的django,很多写法和现在都不一样了。
我不知道是接着把这本书学完,还是直接看推荐的 Two Scoops of Django?

这里遇到了一个问题:
关于form里需要填写url,能否自动补全前面的「http://」?
我看教程里是重写了forms的clean方法。
我按照教程看写了一下,并不能达成效果:

class PageForm(forms.ModelForm):
    title = forms.CharField(max_length=128,help_text='请输入文章名')
    url = forms.URLField(max_length=128,help_text='请输入文章的链接')
    views = forms.IntegerField(widget=forms.HiddenInput(),initial=0)

    def clean(self):
        '''
        方便的补全url
        '''
        # 从父类得到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

        # 这里规定了我们的form里显示哪些字段
        # 这样我们就不用显示model里的所有字段
        # 比如null的字段,
        # 在这个例子中,我们省略了外键 category的字段
        fields = ('title','url','views')  

请问我应该怎么实现这个功能呢?

  • 7 条回复 | 2 人参与
  • 书中的方法是正确的吧?当然对于单一的 feied,最好是复写 clean_<field_name> 方法,比如复写 clean_url 方法。

  • @追梦人物 谢谢回复,可是我按照这样写并不能达到效果,
    是不是喔模板或者视图函数里写错了呢? 请指点一下 谢谢!

    下面是我按照教程写的

  • 报的错误是什么?以及需求是什么?@Ehco1996

  • @追梦人物

    需求是 比如我输入 www.123.com, 他不会弹出提示,「请输入网址。」 而是会自动帮我们在网址前面加入http://

    原文是这样说的

    Recall that our Page model has a url attribute set to an instance of the URLField type. In a corresponding HTML form, Django would reasonably expect any text entered into a url field to be a well-formed, complete URL. However, users can find entering something like http://www.url.com to be cumbersome - indeed, users may not even know what forms a correct URL!

    In scenarios where user input may not be entirely correct, we can override the clean() method implemented in ModelForm. This method is called upon before saving form data to a new model instance, and thus provides us with a logical place to insert code which can verify - and even fix - any form data the user inputs. In our example above, we can check if the value of url field entered by the user starts with http:// - and if it doesn’t, we can prepend http:// to the user’s input.

  • 我明白了,这是由于浏览器自己开启了 html5 验证,关闭浏览器端的验证即可。

  • @追梦人物 实在是太感谢了! 解决了,

    只需要在 在模板的form里增加一个 novalidate属性就行,

    <form id="category_form" method="post" action="/rango/add_page/{{ category_name }}/" novalidate>

    自己懂得还是太少,需要不断学习。

  • 测试一下,支持语法搞亮了?

    import os
    
    print('Hello world')
    
添加一条新回复
登录 或者 注册 后发表回复