是否可以在管理面板中限制模型的对象创建?

时间:2009-09-29 18:27:43

标签: django django-models

我只是想知道可以在管理面板中限制模型的对象数量吗?

例如,我有一个名为'Homepage'的模型,在管理面板中,我不希望用户可以创建多个主页实例。

我有办法做到这一点吗?

3 个答案:

答案 0 :(得分:7)

如果它只是您想要影响的管理员(并且不想影响数据库模型),您可以创建自定义的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方法强制执行单个HomePage要求。这将使您的需求显示为验证错误,而不是重定向(或数据库错误):

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)

如果是“每个用户一个主页”,则需要HomePage为用户提供ForeignKey并进行上述调整。您可能还需要将当前User对象存储在threadlocals中,以便从HomePageModelForm.clean

访问它

答案 1 :(得分:0)

如果您希望将Homepage限制为每个用户一个,那么您可以使用OneToOneField一对一的关系。至于限制为N - pre_save signal可能有用。

答案 2 :(得分:0)

尝试

class HomePage(models.Model):
  user = models.ForeignKey(User, unique=True)
  homepage = models.CharField(max_length=100, unique=True)

  class Meta:
    unique_together = (("user", "homepage"),)