from django import forms
from django.core.exceptions import ValidationError
from .models import MyModel
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['field1', 'field2']
def clean(self):
cleaned_data = super().clean()
field1 = cleaned_data.get('field1')
field2 = cleaned_data.get('field2')
if field1 and field2 and field1 == field2:
raise ValidationError("field1 and field2 must be different.")
return cleaned_data
from django.shortcuts import redirect, render
from django.views.generic.edit import FormView
from .forms import MyModelForm
from .models import MyModel
django modelform 的如何 覆盖 clean 与 form_valid 方法
在 Django 中,使用 ModelForm 类时,你可以通过继承该类并覆盖其方法来定制表单的验证和保存逻辑。如果你想覆盖 clean() 方法或 form_valid() 方法,你可以通过创建一个自定义的 ModelForm 类来实现。
覆盖 clean() 方法
clean() 方法用于在表单验证阶段进行自定义的字段验证。你可以在 clean() 方法中访问表单的各个字段并执行自定义的验证逻辑。如果验证失败,应该抛出 ValidationError 异常。
from django import forms
from django.core.exceptions import ValidationError
from .models import MyModel
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['field1', 'field2']
覆盖 form_valid() 方法
form_valid() 方法在视图类中使用,特别是在使用 CreateView 或 UpdateView 时。它在你确认表单数据有效并准备保存数据到模型时被调用。你可以在这个方法中添加额外的逻辑,比如额外的模型保存逻辑或发送邮件等。
如果你正在使用 Django 的类视图(如 CreateView 或 UpdateView),你可以覆盖这些视图的 form_valid() 方法。例如:
from django.views.generic.edit import CreateView, UpdateView
from .forms import MyModelForm
from .models import MyModel
class MyModelCreateView(CreateView):
model = MyModel
form_class = MyModelForm
template_name = 'my_template.html' # 指定模板文件路径
success_url = '/success-url/' # 成功提交后的重定向地址
如果你使用的是函数视图(如 FormView),你可以这样覆盖 form_valid:
from django.shortcuts import redirect, render
from django.views.generic.edit import FormView
from .forms import MyModelForm
from .models import MyModel
class MyModelFormView(FormView):
form_class = MyModelForm
template_name = 'my_template.html' # 指定模板文件路径
success_url = '/success-url/' # 成功提交后的重定向地址