4

Django admin では、編集可能な ManyToManyField をリスト表示に表示できるようにしたいと本当に思っています。

必ずしも完全な ManyToManyField コントロールである必要はありません。1 つの値だけを保存できれば、リスト表示の目的には十分です (基本的な値は本質的に多対多ですが)。

私のモデルは次のようになります。

class Item(models.Model):
    name = models.CharField(max_length=500)
    colour = models.ManyToManyField(Colour, related_name='primary_colour')

でこれを試してみるとadmin.py

class ItemAdmin(admin.ModelAdmin):
    list_display = ('name', 'colour')
    list_editable = ('colour')

次に、次のエラーが表示されます。

'ItemAdmin.list_display[6]', 'colour' is a ManyToManyField which is not supported.

リスト表示で迅速に編集するために、編集可能な ManyToManyField を表示する方法はありますか?

リスト表示に値を表示するが編集できないようにする方法を説明するこの関連する質問を見つけました: ManyToManyField widget in a django admin change list?

4

2 に答える 2

2

デフォルトでは、Django は ModelAdmin の list_editable に ManyToManyField を追加することを許可しません。したがって、モデル管理メソッドをオーバーライドする必要があります。

モデルを見て、リスト表示ページで編集可能な ManyToManyField を取得するには、以下の手順に従う必要があります。

apps/forms.pyでは 、リスト表示ページで編集可能にする必要がある ManyToMany フィールドを定義する必要があります。以下のように、

from django import forms
from app.models import Item


class ItemChangeListForm(forms.ModelForm):

    # here we only need to define the field we want to be editable
    colour = forms.ModelMultipleChoiceField(queryset=Colour.objects.all(), 
        required=False)

app/admin.py では、 モデル admin のメソッドをオーバーライドする必要があります。以下のように、

from django.contrib import admin
from django.contrib.admin.views.main import ChangeList
from app.models import Item
from app.forms import ItemChangeListForm

class ItemChangeList(ChangeList):

    def __init__(self, request, model, list_display,
        list_display_links, list_filter, date_hierarchy,
        search_fields, list_select_related, list_per_page,
        list_max_show_all, list_editable, model_admin):

        super(ItemChangeList, self).__init__(request, model,
            list_display, list_display_links, list_filter,
            date_hierarchy, search_fields, list_select_related,
            list_per_page, list_max_show_all, list_editable, 
            model_admin)

        # these need to be defined here, and not in ItemAdmin
        self.list_display = ['action_checkbox', 'name', 'colour']
        self.list_display_links = ['name']
        self.list_editable = ['colour']


class ItemAdmin(admin.ModelAdmin):

    def get_changelist(self, request, **kwargs):
        return ItemChangeList

    def get_changelist_form(self, request, **kwargs):
        return ItemChangeListForm


admin.site.register(Item, ItemAdmin)

これで、変更を確認し、サーバーを実行し、ムービー モデルの django admin を確認するように設定されました。ManyToMany フィールドは一覧表示ページから直接編集できます。

:リストで編集可能な複数の ManyToManyFields を使用する場合は、settings.pyで DATA_UPLOAD_MAX_NUMBER_FIELDS を設定する必要があります。

于 2018-07-13T13:38:53.160 に答える
1

カスタム ビューを管理 URL に簡単に追加し、必要な html/javascript/ajax を追加できます。基本は次のとおりです。

class ItemAdmin(admin.ModelAdmin):
    # regular stuff

    def render_foo(self, obj):
        # add this to your list_display
        html = '<stuff><input/submit action></stuff>'
        return mark_safe(html)

    def get_urls(self):
        urls = super(ItemAdmin, self).get_urls()
        extra_urls = patterns('',
            (r'^process_foo/$', self.admin_site.admin_view(self.process_foo)),
        )
        return extra_urls + urls

    def process_foo(self, request):
        if not request.is_ajax():
            raise Http404
        foo = request.GET.get("attr")
        # process m2m
        # return some json
于 2013-03-27T09:46:26.920 に答える