在Django管理中将装饰器应用于formfield_for_foreignkey

时间:2019-05-03 13:27:25

标签: django django-admin python-decorators

我有多个使用外键下拉菜单的模型,我想根据条件自定义外键下拉菜单。我尝试使用装饰器,但在添加管理表单中出现下拉菜单

from .decorators import admin_active_country
.
.
.
@admin_active_country
def formfield_for_foreignkey(self, db_field, request, **kwargs):
    return super().formfield_for_foreignkey(db_field, request, **kwargs)

我创建了装饰器以实现以下效果

        if db_field.name == "country":
            kwargs["queryset"] = Country.objects.filter(is_active=True)

这是装饰器,但是使用装饰器时,我看不到管理页面中的下拉列表,消失了

def admin_active_country(func):
    print(func,"function priniting")
    @functools.wraps(func)
    def wraps(*args,**kwargs):
         # ags[1] is db_field 
        if args[1].name == "country":

            kwargs["queryset"] =  Country.objects.filter(is_active=True)
        return func(*args,**kwargs)

    return wraps

下面的代码工作正常,我想使用装饰器实现相同的效果,以便我可以通过遵循DRY将其应用于多个管理员

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "country":
            kwargs["queryset"] = Country.objects.filter(is_active=True)
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

请帮帮我,谢谢!

0 个答案:

没有答案