Python中Django框架的cleaned_data用法请教,谢谢大家。
要上传 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)
Python中Django框架的cleaned_data用法请教,谢谢大家。
clean 应该要有针对性。python<br>def clean_url(self):<br> url = self.cleaned_data.get('url')<br><br> if not url:<br> raise forms.ValidationError("......")<br><br> if not url.startswith('http://'):<br> return 'http://' + url<br><br> return url<br>
在Django里,cleaned_data是表单验证通过后,存放清洗过的数据的一个字典。你拿到的是处理好的、符合字段类型要求的数据,比如日期字符串会转成datetime.date对象。
主要用法就两步:
- 在自定义的
clean_<fieldname>()方法里,你可以对单个字段做额外清洗,最后return的值就会进cleaned_data。 - 在
clean()方法里,你可以访问self.cleaned_data来做跨字段验证,有问题就抛ValidationError。
看个简单例子,比如注册时要确认邮箱后缀:
from django import forms
from django.core.exceptions import ValidationError
class RegisterForm(forms.Form):
email = forms.EmailField()
email_confirm = forms.EmailField()
def clean_email(self):
# 单个字段清洗:转小写
email = self.cleaned_data.get('email', '').lower()
if not email.endswith('@example.com'):
raise ValidationError("只允许注册example.com的邮箱。")
return email
def clean(self):
# 跨字段验证
cleaned_data = super().clean()
email = cleaned_data.get('email')
email_confirm = cleaned_data.get('email_confirm')
if email and email_confirm and email != email_confirm:
raise ValidationError("两个邮箱地址必须一致。")
# 记得返回整个cleaned_data
return cleaned_data
在视图里这么用:
def register_view(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
# 这里拿到的就是清洗好的数据
clean_email = form.cleaned_data['email']
# ... 保存用户等操作
else:
form = RegisterForm()
# ... 渲染模板
简单说,is_valid()通过后,cleaned_data就是你的安全数据源。
你好,我想请教 clean 函数是自动执行的吗
clean() 或者 clean_xxx() 会在执行 form.is_valid() 的过城中被调用
谢谢你。

