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

2017-07-13 19:44:21 +08:00
 garygay
要上传 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)
4432 次点击
所在节点    Python
4 条回复
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
2017-07-14 09:24:04 +08:00
@hactrox 你好,我想请教 clean 函数是自动执行的吗
hactrox
2017-07-14 09:40:25 +08:00
@garygay clean() 或者 clean_xxx() 会在执行 form.is_valid() 的过城中被调用
garygay
2017-07-14 14:46:07 +08:00
@hactrox 谢谢你。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/375149

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX