是否可以在管理面板中限制模型的对象创建?
问题描述:
我只想知道是否可以限制管理面板中模型的对象数量?是否可以在管理面板中限制模型的对象创建?
例如,我有一个名为'Homepage'的模型,并且在管理面板中我不希望用户可以创建多个主页实例。
有没有一种方法可以做到这一点?
答
如果只是要影响(而不想影响数据库模型)的管理员,您可以创建自定义的ModelAdmin子类:
class HomePageAdmin(admin.ModelAdmin):
def add_view(self, request):
if request.method == "POST":
# Assuming you want a single, global HomePage object
if HomePage.objects.count() > 1:
# redirect to a page saying
# you can't create more than one
return HttpResponseRedirect("foo")
return super(HomePageAdmin, self).add_view(request)
# ...
admin.site.register(HomePage, HomePageAdmin)
做同样事情的另一种策略是为HomePage创建一个自定义的ModelForm,其中一个clean
方法强制执行单个主页的要求。这会让你的需求出现验证错误,而不是作为一个重定向比(或者数据库错误):
from django import forms
from django.forms.util import ErrorList
class HomePageModelForm(forms.ModelForm):
def clean(self):
if HomePage.objects.count() > 1:
self._errors.setdefault('__all__', ErrorList()).append("You can only create one HomePage object.")
return self.cleaned_data
# ...
class HomePageAdmin(admin.ModelAdmin):
form = HomePageModelForm
# ...
admin.site.register(HomePage, HomePageAdmin)
如果它的“每个用户一个主页”,你将需要主页有一个ForeignKey到用户并适应以上。您可能还需要将当前的User对象存储在threadlocals中以便从HomePageModelForm.clean
答
尝试
class HomePage(models.Model):
user = models.ForeignKey(User, unique=True)
homepage = models.CharField(max_length=100, unique=True)
class Meta:
unique_together = (("user", "homepage"),)
中访问它,谢谢..这是一个非常明确的解释;) – israkir 2009-10-02 20:12:26