Используйте JavaScript для добавления динамических полей на сайт администратора Django - PullRequest
1 голос
/ 04 мая 2019

Я использую Django 2.2 с Python 3.7, мой вопрос состоит из двух частей:

  1. Основной целью является создание динамических полей над моделями на странице администратора, поэтому, например, у меня есть CharField с несколькими вариантами выбора, и только то, что charfield отображается со значением null, поэтому, если Я изменяю его на какой-то другой вариант, и ниже появится charfield с большим количеством опций, чтобы выбрать, конечно, все charfields определены в models.py, просто скрыты от сайта администратора, пока не будет выполнено условие, я думаю, что лучше подход будет использовать JavaScript, я добавил папку /media/ в свой проект, но я плохо понимал, как интегрировать JavaScript на сайт администратора, какая-нибудь помощь по этому поводу?
  2. Я новичок в JavaScript, я даже не знаю, как получить доступ к атрибутам моделей для использования методов .show() и .hide(), кто-нибудь может указать мне правильное направление, чтобы установить простые условия для отображения или скрыть поля на основе другого?

Мой класс администратора, который содержит модель, которую я хочу скрыть и показать поля, следующий:

class RecipesAdmin(admin.ModelAdmin):
    fieldsets = [
        ("Title/Description", {"fields": ["recipe_title", "recipe_ingredients"]}),
        ("Ingredients sequence", {"fields": ["sequence"]}),
        ("Recipe Sequence", {"fields": ["motor1", "motor2", "motor3", "motor4", "pump", "temp", "recipe_interval"]}),
        ("Photo and Create Date", {"fields": ["recipe_photo", "recipe_created"]})
    ]

    formfield_overrides = {
        models.TextField: {'widget': TinyMCE()}
    }

Если вы видите «Последовательность рецептов», она имеет несколько значений, я хочу, чтобы motor2, 3, 4 и остальные отображались в соответствии с предыдущим, поэтому не представляю, как получить доступ к этой части кода из JavaScript

1 Ответ

1 голос
/ 05 июня 2019

Я решил это самостоятельно следующим образом, я добавил в свой класс администратора RecipesAdmin класс Media, указывающий на файл сценария java и определяющий классы в массиве fieldsets:

class RecipesAdmin(admin.ModelAdmin):
    fieldsets = [
        ("Title/Description", {"fields": ["recipe_title", "recipe_ingredients"]}),
        ("Ingredients sequence", {"fields": ["sequence"]}),
        (None, {"fields": ["sequence2",], "classes": ("HiddenSequence",)}),
        ("Photo and Create Date", {"fields": ["recipe_photo", "recipe_created"]})
    ]

    class Media:
       js = ('main/JS/ShowOrHideSequence.js',)

Как вывидите, поле sequence2 имеет класс HiddenSequence, это позволит мне контролировать все с помощью JavaScript, код javascript следующий:

$(function($) {
    $(function() {
        var sequence = $('#id_sequence'), verified = $('.HiddenSequence');

        function toggleVerified(value, HiddenSeq) {
            if (value !== '') {
                HiddenSeq.show();
            } else {
                HiddenSeq.hide();
            }
        }

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

        // show/hide on change
        sequence.change(function() {
            toggleVerified($(this).val(), verified);
        });
    });
});

Обратите внимание, я нашел этот JavaScript через Интернет,не сделан мной, и, как вы можете понять, он проверяет, отличается ли значение «sequence» от «», если true, показывает sequence2, если false, скрывает его.

Файл javascript должен находиться в статической папке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...