【问题标题】:Django - add choice field to django admin list_filterDjango - 将选择字段添加到 django admin list_filter
【发布时间】:2018-03-05 19:56:10
【问题描述】:

这是我的 django 管理类之一:

class InactiveSiteAdmin(SiteAdmin):
    change_list_template = 'admin/change_list_inactive.html'
    list_display = ('is_active', 'thumb', 'name', 'show_url', 'get_desc', 
        'keywords','category', 'subcategory', 'category1', 'subcategory1', 
        'group')
    fields = ('name', 'url', 'id', 'category', 'subcategory', 'category1',
          'subcategory1', 'description',
          'keywords', 'date', 'group', 'user', 'is_active', 'date_end',)
    readonly_fields = ('date', 'date_end', 'id')
    list_display_links = ('name',)
    actions = [activate_sites, activate_sites1, ]

    def get_queryset(self, request):
        return Site.objects.filter(is_active=False)

    def response_change(self, request, obj):
        return redirect('/admin/mainapp/site/{}/change/'.format(obj.id))

    def has_add_permission(self, request):
       return False

“activate_sites”操作用于接受选定对象(使其可见)并将确认电子邮件发送到 obj.email(选定对象的电子邮件字段)。我想向 list_display 添加另一个字段 - 例如“email_text”,超级用户将在其中选择正确的文本消息(使用选择字段)。可能吗?例如,我有 3 个对象。我想给机会激活所有 3 个对象并为每个对象选择不同的文本消息。

我尝试添加如下内容:

def email_send_field(self, request):
    MY_CHOICES = (
        ('A', 'Choice A'),
        ('B', 'Choice B'),
    )

    return(forms.ChoiceField(choices=MY_CHOICES))

但我在 list_display 中得到“”。

【问题讨论】:

    标签: django django-admin django-admin-actions


    【解决方案1】:

    您可以使用 format_html 方法插入您的自定义 html 并在 POST 数据中获取所选值。

    请注意为每个选择元素生成一个唯一的名称。

    在本例中,它使用对象主键:

    from django.utils.html import format_html
    
    MY_CHOICES = (
        ('msg1', 'Hello'),
        ('msg2', 'Hi'),
    )
    
    class InactiveSiteAdmin(SiteAdmin):
        list_display = list_display = ( ...,  'show_select')
         actions = ['send_email']
    
        def show_select(self, obj):
            html_select = "<select name='dropdown-obj-"+str(obj.pk)+"'>"
            for option in MY_CHOICES:
                html_select += "<option value='{}'>{}</option>".format(option[1], option[0])
            html_select += "</select> "
    
            return format_html(html_select)
    
        def send_email(self, request, queryset):
            for obj in queryset:
                obj_msg = request.POST['dropdown-obj-'+str(obj.pk)]
                #do something with the custom message
    

    【讨论】:

    • 谢谢。这是个好主意。我正在以正确的方式解决我所有的问题;)
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2012-03-30
    • 2012-04-06
    • 2021-09-03
    • 2015-01-08
    • 2016-06-02
    相关资源
    最近更新 更多