如何在Django中admin.py的inline函数中添加数据验证
时间: 2024-03-27 22:40:11 浏览: 138
在 Django Admin 中,如果您想要在 `inline` 中添加数据验证,可以使用 `clean()` 方法。`clean()` 方法是模型实例的方法,用于在保存实例之前执行验证。当您使用 Django 的表单或模型表单进行数据验证时,`clean()` 方法会在验证之前被调用。在 `clean()` 方法中,您可以访问模型实例的所有属性,并执行任何自定义的验证逻辑。如果验证失败,您可以引发 `ValidationError` 并防止保存模型实例。
下面是一个示例,假设我们有两个模型 `Author` 和 `Book`,每个作者可以有多本书。我们想要在编辑作者时,确保所有书籍的名称都是唯一的。我们可以使用以下方法来实现:
```python
from django.core.exceptions import ValidationError
from django.forms.models import BaseInlineFormSet
from django.contrib import admin
from .models import Author, Book
class BookInlineFormSet(BaseInlineFormSet):
def clean(self):
super().clean()
book_names = set()
for form in self.forms:
if form.cleaned_data.get('DELETE') is True:
continue
book_name = form.cleaned_data.get('name')
if book_name in book_names:
raise ValidationError('Duplicate book name')
book_names.add(book_name)
class BookInline(admin.TabularInline):
model = Book
formset = BookInlineFormSet
class AuthorAdmin(admin.ModelAdmin):
inlines = [BookInline]
admin.site.register(Author, AuthorAdmin)
```
在上面的示例中,我们定义了一个名为 `BookInlineFormSet` 的自定义表单集,用于验证 `inline` 表单中的书籍名称是否唯一。如果发现重复的书籍名称,我们将引发 `ValidationError` 并阻止保存模型实例。我们还将 `BookInline` 类的 `formset` 属性设置为我们的自定义表单集,以便 Django Admin 在编辑作者时使用它。
请注意,我们在 `clean()` 方法中使用 `form.cleaned_data.get('DELETE')` 检查表单是否被标记为删除。这是因为 Django Admin 中的 `inline` 表单可能包含已删除或尚未保存的表单,这些表单可能会在表单集中引发错误。通过检查 `DELETE` 属性,我们可以跳过这些表单并确保验证仅适用于实际编辑的表单。
阅读全文