首页 > 解决方案 > django admin如何在使用自定义操作按钮时添加上下文?

问题描述

我的管理面板中的每条记录都有一个自定义操作按钮“添加帖子”。我想保存在上下文中以将其用作表单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

标签: djangodjango-formsdjango-admin

解决方案


您可以将 GET 参数添加到 url。

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': 'fieldval'}形式的字典:

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

或者

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

推荐阅读