V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
garygay
V2EX  ›  Python

请教 Django 中 cleaned_data 的一个用法,谢谢大家。

  •  
  •   garygay · 2017-07-13 19:44:21 +08:00 · 4586 次点击
    这是一个创建于 2727 天前的主题,其中的信息可能已经有所发展或是发生改变。
    要上传 URL,用的自带的 URLField,但是默认是必须输入 http 开头,现在想让用户不输入。现在代码是

    class PageForm(forms.ModelForm):
    title = forms.CharField(max_length=128, help_text='Please enter the title')
    url = forms.URLField(max_length=200, help_text='Please enter the URL')
    views = forms.CharField(widget=forms.HiddenInput(), initial=0)

    class Meta:
    model = Page
    exclude = ('category',)

    #这一段不知道怎么起效果
    def clean(self):
    cleaned_data = self.cleaned_data
    url = cleaned_data.get('url')

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

    return cleaned_data

    views 里的代码:
    def add_page(request, category_name_slug):
    try:
    category = Category.objects.get(slug=category_name_slug)
    except Category.DoesNotExist:
    category = None

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

    context_dict = {'form': form, 'category': category}
    return render(request, 'rango/add_page.html', context_dict)
    4 条回复    2017-07-14 14:46:07 +08:00
    hactrox
        1
    hactrox  
       2017-07-14 01:00:59 +08:00
    clean 应该要有针对性。

    ```python
    def clean_url(self):
    url = self.cleaned_data.get('url')

    if not url:
    raise forms.ValidationError("......")

    if not url.startswith('http://'):
    return 'http://' + url

    return url
    ```
    garygay
        2
    garygay  
    OP
       2017-07-14 09:24:04 +08:00
    @hactrox 你好,我想请教 clean 函数是自动执行的吗
    hactrox
        3
    hactrox  
       2017-07-14 09:40:25 +08:00   ❤️ 1
    @garygay clean() 或者 clean_xxx() 会在执行 form.is_valid() 的过城中被调用
    garygay
        4
    garygay  
    OP
       2017-07-14 14:46:07 +08:00
    @hactrox 谢谢你。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1228 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:37 · PVG 07:37 · LAX 15:37 · JFK 18:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.