python - 如何使用获取请求参数的自定义验证方法
问题描述
我有一个非常简单的表单,我正在对其进行一些验证:
def clean(self):
cleaned_data = super().clean()
start = cleaned_data.get("start")
end = cleaned_data.get("end")
if start >= end:
raise ValidationError("start should not be greater than end.")
但我需要添加另一个验证(基于发出请求的用户)。
我试图将参数添加到 clean 方法中:
def clean(self, user):
cleaned_data = super().clean()
start = cleaned_data.get("start")
end = cleaned_data.get("end")
if start >= end:
raise ValidationError("start should not be greater than end.")
if not user.email.endswith("@example.com"):
raise ValidationError("blah...")
不幸的是,我无法在视图中使用参数调用 is_valid():
if form.is_valid(request.user):
....
我收到以下错误消息:
is_valid() 接受 1 个位置参数,但给出了 2 个
我还尝试在表单中添加一个新方法:
def validate_email(self, user):
if not user.email.endswith("@example.com")::
raise ValidationError("blah...")
并从视图中调用它:
if form.is_valid() and form.validate_email(request.user):
obj = form.save(commit=False)
obj.created_by = request.user
obj.save()
在这种情况下,异常真的会被抛出并使应用程序崩溃。
我的目标是:
- 使验证依赖于请求中的标准
- 验证失败时正常显示错误信息
实现自定义验证的正确方法是什么?
解决方案
我会创建一个简单的 mixin 类
class FormContextMixin:
def __init__(self, *args, **kwargs):
self.context = kwargs.pop("context", {})
super().__init__(*args, **kwargs)
然后将FormContextMixin
类与您的表单类一起使用
class AlbumModelForm(FormContextMixin, forms.ModelForm):
def clean(self):
user = self.context["request"].user
# doe something with `user`
class Meta:
fields = '__all__'
model = Album
因此,您可以使用任意数据将表单初始化为
form = AlbumModelForm(request.POST, context={"request": request})
推荐阅读
- python - 无法在阿里巴巴 EC 实例 (Ubuntu 20.04.2) 中为 python 3.8.10 安装 pytesseract
- amazon-web-services - 如何在 EC2 Image Builder(Golden AMI)中安装 My SQL
- spring-webflux - Spring WebFlux 功能路由器 + OpenAPI UI
- python - 在Python中将wav文件与空格结合起来
- javascript - 阻止 nuxt 查看特定范围内的文件夹
- python - Python - 迭代时 lambda 的意外行为
- python - 如何覆盖日志库函数以需要强制参数?
- rust - 如何在 Vec 内部的泛型类型上重载函数或方法?
- vba - 如何在打开的电子邮件中附加文件?
- mongodb - MongoDB 查询巨大的动态对象字段