2017-09-24 93 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