vor*_*pyg 24 django django-models django-admin
我有模型,我只想创建一个实例,不应再允许实例.
这可能吗?我有一种感觉,我已经在某处看到过这种情况,但不幸的是我无法找到它.
编辑:我需要这个愚蠢的简单CMS.我有一个FrontPage和Page类继承的抽象类.我只想创建一个frontpage对象.
FrontPage对象和Page对象之间的区别在于它们应该具有稍微不同的字段和模板,并且如上所述,仅创建一个FrontPage.
nco*_*lan 30
我想自己做类似的事情,发现Django的模型验证提供了一个方便的执行钩子:
from django.db import models
from django.core.exceptions import ValidationError
def validate_only_one_instance(obj):
model = obj.__class__
if (model.objects.count() > 0 and
obj.id != model.objects.get().id):
raise ValidationError("Can only create 1 %s instance" % model.__name__)
class Example(models.Model):
def clean(self):
validate_only_one_instance(self)
Run Code Online (Sandbox Code Playgroud)
这不仅阻止了新实例的创建,而且Django管理UI实际上会报告创建失败,原因是"只能创建1个示例实例"(而文档中的早期返回方法没有说明为什么保存不起作用).
Bre*_*dan 23
如果您只是想阻止使用管理界面的用户创建额外的模型对象,您可以修改模型的ModelAdmin类的"has_add_permission"方法:
# admin.py
from django.contrib import admin
from example.models import Example
class ExampleAdmin(admin.ModelAdmin):
def has_add_permission(self, request):
num_objects = self.model.objects.count()
if num_objects >= 1:
return False
else:
return True
admin.site.register(Example, ExampleAdmin)
Run Code Online (Sandbox Code Playgroud)
这将删除管理界面中的"添加"按钮,防止用户甚至尝试创建超过指定数量(在本例中为1).当然,编程添加仍然是可能的.
你可以从 Django 文档中执行以下操作:
class ModelWithOnlyOneInstance(models.Model):
... fields ...
def save(self, *args, **kwargs):
if ModelWithOnlyOneInstance.objects.count() > 1:
return
super(ModelWithOnlyOneInstance, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)