Django Admin - условно показать / скрыть поля - PullRequest
0 голосов
/ 23 января 2020

У меня проблема, очень похожая на описанную в этот вопрос . Я реализовал решение нескольких наборов полей, и оно работает довольно хорошо. Однако, я сталкиваюсь с проблемой, когда пытаюсь добавить поля, которые принадлежат нескольким наборам полей:

(admin.E012) There are duplicate field(s) in 'fieldsets[2][1]'.

item_field2 требуется в foo и bar, но не baz (следовательно, оно не может быть в начальном наборе полей). Я вижу, как это проблема, но не уверен, как обойти это.

admin.py

from django.contrib import admin

@admin.register(Item)
class ItemAdmin(admin.ModelAdmin):
    fieldsets = (
        # This first fieldset is always displayed
        (None, { 
            'classes': ('item',), 
            'fields': ('item_type') # type is a select input with 'foo' and 'bar' options
        }),
        # Only one of the below fieldsets are displayed, depending on which item_type is chosen from the above select input
        (None, {
            'classes': ('foo',),
            'fields': ('item_field1, item_field2')
        }),
        (None, {
            'classes': ('bar',),
            'fields': ('item_field2, item_field3')
        }),
        (None, {
            'classes': ('baz',),
            'fields': ('item_field4')
        })
    )

    class Media:
        js = ('admin.js',)

admin. js

window.addEventListener('load', function() {
  (function($) {
    var selectField = $('#id_item_type')
    var foo = $('.foo');
    var bar = $('.bar');
    var baz = $('.baz');

    function toggleVerified(value) {
      if (value === '1') { // 'foo' selected
        foo.show();
        bar.hide();
        baz.hide();
      }
      else if (value === '2') { // 'bar' selected
        foo.hide();
        bar.show();
        baz.hide();
      }
      else if (value === '3') { // 'baz' selected
        foo.hide();
        bar.hide();
        baz.show();
      }
      else { // Nothing selected yet
        bar.hide();
        foo.hide();
        baz.hide();
      }
    }

    // show/hide on load based on pervious value of selectField
    toggleVerified(selectField.val());

    // show/hide on change
    selectField.change(function() {
      toggleVerified($(this).val());
    });
  })(django.jQuery);
});

...