【问题标题】:How to restrict dropdown in Django admin如何在 Django admin 中限制下拉菜单
【发布时间】:2010-11-16 16:52:18
【问题描述】:
class A(models.Model):
    foreign = models.ForeignKey(B, unique=True)

我有上面的代码 - 我如何确保在 A's Admin 下的下拉列表中,对于“外国”,我只能看到唯一的选择?这只是为了防止用户违反唯一性约束并显示管理员错误消息。

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    请查看 ModelAdmin.formfield_for_foreignkey() here。缺点是不得不求助于raw SQL

    class AModelAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "foreign":
            kwargs["queryset"] = B.objects.raw('SELECT * FROM myapp_a where not exists (select id from myapp_b where b.id=a.foreign_id')
        return super(AModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
    

    恕我直言,“非空非空白唯一 FK”看起来是重新考虑您的建模的好机会 - 可能正在合并两个模型。每次我发现自己在 Django 中苦苦挣扎时,我都在尝试做一些幼稚的事情。

    【讨论】:

    • 不幸的是,这不起作用,因为管理模板未正确呈现 - 我得到:“呈现时捕获 AttributeError:'RawQuerySet' 对象没有属性 'all'”
    • 如果您在code.djangoproject.com 处打开一个错误,我可以发送一个补丁以向 RawQuerySet 添加一个虚拟 all() 方法。
    • 你也可以试试:kwargs["queryset"].all = kwargs["queryset"].__iter__
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2013-06-03
    相关资源
    最近更新 更多