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

标签 django django-models

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

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

我有办法做到这一点吗?

最佳答案

如果您只想影响管理员(并且不想影响数据库模型),您可以创建一个自定义的 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)

如果它是“每个用户一个主页”,您将需要主页具有指向用户的外键并调整上述内容。您可能还需要将当前 User 对象存储在 threadlocals 中,以便从 HomePageModelForm.clean

访问它

关于django - 是否可以在管理面板中限制模型的对象创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1494168/

相关文章:

python - 限制 Django Tastypie 中嵌套资源的数量?

python - django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist 通过测试 django 形式

python - 当数据库值更改时,Django 发送推送通知

python - 修复在 Django1.9 中检测到的迁移冲突

Django 临时字段仅在创建时

python - 通过电子邮件重置 Django 密码

linux - 无法访问ec2实例开发服务器上的django网站

python - 遍历模型字段 - Django

python - 如何在django中的单个 View 中显示多个ForeignKey过滤项?

Django 唯一的一起约束与关系