【问题标题】:Django admin actions update foreign keyDjango 管理操作更新外键
【发布时间】:2014-08-14 21:51:32
【问题描述】:

我在 admin.py 文件中添加了这个简单的操作。

def groupA(modeladmin, request, queryset):
    queryset.update(group=1)
groupA.short_description = "Group A"

//
class StudentAdmin(admin.ModelAdmin):
...
actions = [groupA]

到目前为止,一切都按预期工作。

问题是 group 是一个外键,如果我可以做类似的事情会更易于管理

def groupA(modeladmin, request, queryset):
    queryset.update(group="A")
groupA.short_description = "Group A"

我尝试了下面的查询集,但没有运气。

     queryset.update(group__name="A")

我的组模型看起来像这样:

class Group(models.Model):
    name = models.CharField(max_length=5, default='', blank=True)
    ....

    def __str__(self):
        return self.name

那么是否可以使用我的 Group 模型的 str 表示来执行管理操作?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    你为什么不导入组模型,获取组A并像这样更新?

    def groupA(modeladmin, request, queryset):
        from models import Group
        g = Group.objects.get(name="Group A")
        queryset.update(group=g)
    

    【讨论】:

    • 成功了!假设我有 20 个组,除了定义 20 个函数之外,有没有一种优雅的方式来填充动作?
    • 我认为有办法做到这一点,但我不确定:(
    • 我找到了一个片段,就像一个魅力! djangosnippets.org/snippets/1836
    【解决方案2】:

    我遇到了同样的问题,并注意到@metraon 实际上找到了一个不错的 sn-p,但它只存在于 cmets 中。 sn-p 对我来说就像一个魅力,即使现在已经 7 年了,所以我想通过将它作为答案发布来让它更容易找到。

    这是 sn-p,由 metraon 在https://djangosnippets.org/snippets/1836/ 找到:

    def create_action(quality):
        def action(modeladmin, request, queryset): queryset.update(quality=quality)
        name = "mark_%s" % (quality,)
        return (name, (action, name, "Mark selected as %s quality" % (quality,)))
    
    class PackageAdmin(admin.ModelAdmin):
        list_display = ('name', 'quality')
                
        def get_actions(self, request):
            return dict(create_action(q) for q in models.Quality.objects.all())
    

    【讨论】:

    • 我很欣赏它的工作原理,但这里有很多巫毒教 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多