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用法请教,谢谢大家。


5 回复

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对象。

主要用法就两步:

  1. 在自定义的clean_<fieldname>()方法里,你可以对单个字段做额外清洗,最后return的值就会进cleaned_data
  2. 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() 的过城中被调用

谢谢你。

回到顶部