2017-09-24 9 views
0

list_filter管理者をDjangoのために選択フィールドを追加します。ジャンゴ - これは私のDjangoの管理クラスの1つです

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"のように、スーパーユーザーが正しいテキストメッセージ(choiceフィールドを使用)を選択します。出来ますか?私は例えば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

関連する問題