2017-09-24 78 views
0

这是我的Django管理的一类:Django的 - 增加选择字段Django管理list_filter

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。电子邮件(选定对象的电子邮件字段)。我想向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。

回答

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 
+0

谢谢。这是个好主意。我正在解决我所有的问题;) – jundymek