首页 > 解决方案 > Django 管理面板:如果在下拉列表中选择了特定值,则显示/隐藏字段

问题描述

我究竟做错了什么?
在 django 管理面板中,我想根据选择下拉菜单显示/隐藏字段。此外,选择下拉列表位于父外键相关模型上,要显示/隐藏的字段位于子模型中或作为堆叠内联。
我遵循了这个解决方案(堆栈溢出),但没有成功。

模型.py

from django.db import models

CHOICES = (
        ('video', 'Video'),
        ('text', 'Text'),
        ('question', 'Question'),
)


class Section(models.Model):
    content_type = models.CharField(max_length=32)

    @property
    def contents(self):
        return self.content_set.all()

class Content(models.Model):
    content = models.ForeignKey(Section, on_delete=models.DCASCADE)
    video = models.FileField()
    text = models.TextField()
    question = models.CharField(max_length=512)

管理员.py

from django.contrib import admin

from .models import Section, Content
from .forms import DropdownModelForm


class ContentInline(admin.StackedInline):
    model = Content
    fieldsets = (
        (None, {
            'fields': (('video',),),
            'classes': ('vid',)
        }),
        (None, {
            'fields': (('text',),),
            'classes': ('txt',)
        }),
        (None, {
            'fields': (('question',),),
            'classes': ('ques',)
        })
    )

    class Media:
        js = ('one/js/base.js',)

@admin.register(Section)
class SectionAdmin(admin.ModelAdmin):
    form = DropdownModelForm
    inlines = (ContentInline,)

表格.py

from django import forms
from .models import Section, CHOICES

class DropdownModelForm(forms.ModelForm):

    class Meta:
        model = Section
        fields = ('content_type',)
        widgets = {
            'content_type': forms.Select(choices=CHOICES)
        }

base.js

(function($) {
    $(function() {
        var selectField = $('#id_content_type'),
            verified_1 = $('.vid'),
            verified_2 = $('.txt'),
            verified_3 = $('.ques');

        function toggleVerified(value) {
            if (value === 'video') {
                verified_1.show();
                verified_2.hide();
                verified_3.hide();
            } else if (value === 'text') {
                verified_1.hide();
                verified_2.show();
                verified_3.hide();
            } else if (value === 'question') {
                verified_1.hide();
                verified_2.hide();
                verified_3.show();
            }
        }

        // 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);

设置.py

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
.
.
.

INSTALLED_APPS = [
    'one.apps.OneConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
.
.
.

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    BASE_DIR / "static",
]

项目结构

再次,我做错了什么?
在 django 管理面板中,我想根据选择下拉菜单显示/隐藏字段。此外,选择下拉列表位于父外键相关模型上,要显示/隐藏的字段位于子模型中或作为堆叠内联。
我遵循了这个解决方案(堆栈溢出),但没有成功。

非常感谢您花费宝贵的时间并查看我糟糕的代码

标签: pythondjangodjango-admindjango-modeladmin

解决方案


javascript文件作为列表传递admin.py解决了这个问题。

class Media:
        js = ["one/js/base.js",]

另外,不知道为什么 jquery 不能正常工作。因此,为此将您的javascript包装在里面jQuery(document).ready(function ($) { ...your javascript... });,如

jQuery(document).ready(function ($) {
    (function ($) {
        $(function () {
            var selectField = $('#id_content_type'),
                verified_1 = $('.vid'),
                verified_2 = $('.txt'),
                verified_3 = $('.ques');

            function toggleVerified(value) {
                if (value === 'video') {
                    verified_1.show();
                    verified_2.hide();
                    verified_3.hide();
                } else if (value === 'text') {
                    verified_1.hide();
                    verified_2.show();
                    verified_3.hide();
                } else if (value === 'question') {
                    verified_1.hide();
                    verified_2.hide();
                    verified_3.show();
                }
            }

            // 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);
});

推荐阅读