【问题标题】:django admin how to add context when using custom action button?django admin如何在使用自定义操作按钮时添加上下文?
【发布时间】:2021-06-25 21:31:36
【问题描述】:

我的管理面板中的每条记录都有一个自定义操作按钮“添加帖子”。我想在上下文中保存obj.id 以将其用作admin:channels_post_add 表单中的默认值

class ChannelAdmin(admin.ModelAdmin):
    list_display = ['title','username', 'invite_link', 'account_actions']

    def account_actions(self, obj):

        !!!! I WANT TO ADD CONTEXT HERE!!!!

        return format_html('<a class="button" href="{}">Add post</a>', reverse('admin:channels_post_add'))

    account_actions.short_description = 'Actions'
    account_actions.allow_tags = True

    class Meta:
        model = Channel

admin.site.register(Channel, ChannelAdmin)





class PostAdmin(admin.ModelAdmin):
    list_display = ['text', 'media', 'send_type', 'created']

    class Meta:
        model = Post


    def get_form(self, request, obj=None, **kwargs):
        form = super(PostAdmin, self).get_form(request, obj, **kwargs)
        try:

            post_id = !!! AND USE IT HERE!!!!

            form.base_fields['channels'].initial = post_id
        except Exception as e:
            print(e)
        return form

【问题讨论】:

    标签: django django-forms django-admin


    【解决方案1】:

    您可以在 url 中添加 GET 参数。

    url = "%s?pid=%s" % (reverse(admin:channels_post_add), obj.id)
    

    然后request.GET.get("pid") 进入get_form()

    class ChannelAdmin(admin.ModelAdmin):
    
        ...
    
        def account_actions(self, obj):
            url = "%s?pid=%s" % (reverse(admin:channels_post_add), obj.id)
            return format_html('<a class="button" href="{}">Add post</a>', url)
    
    
    
    class PostAdmin(admin.ModelAdmin):
    
        ...
    
        def get_form(self, request, obj=None, **kwargs):
            form = super(PostAdmin, self).get_form(request, obj, **kwargs)
            try:
                form.base_fields['channels'].initial = request.GET.get("pid")
            except Exception as e:
                print(e)
            return form
    

    我认为你必须使用ModelAdmin.get_changeform_initial_data(request)(Django Docs) 来设置初始值。

    用于管理更改表单的初始数据的挂钩。默认情况下,字段 从 GET 参数中获得初始值。例如, ?name=initial_value 会将 name 字段的初始值设置为 initial_value

    此方法应返回 {'fieldname' 形式的字典: '字段值'}

    url = "%s?channels=%s" % (reverse(admin:channels_post_add), obj.id)
    

    def get_changeform_initial_data(self, request):
        return {'channels': request.GET.get("pid")}
    

    【讨论】:

    • 点击该网址时得到Channel with ID “%s” doesn’t exist. Perhaps it was deleted?
    • @yaschk1999,你检查过,它是否存在于数据库中?
    • 是的,频道存在,这是一个按钮,按下后会打开一个用于创建帖子的表单(另一个模型不是频道模型),我希望立即为帖子分配一个默认频道
    • @yaschk1999,你能分享完整的回溯错误吗?
    • @yaschk1999,你试过用url = "%s?channels=%s" % (reverse(admin:channels_post_add), obj.id)。 Django 必须从 GET 参数中设置初始值。
    猜你喜欢
    • 1970-01-01
    • 2018-03-13
    • 2019-10-28
    • 2016-07-29
    • 2011-04-25
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多