我可以在Django管理“添加”页面上自动筛选选项吗?
考虑一个每天一个单词的Django Web应用程序,它每天向用户提供一个词汇单词,这个单词的难度从周一的普通单词增加到周五的晦涩单词 models.py中的模型如下所示:我可以在Django管理“添加”页面上自动筛选选项吗?,django,django-admin,Django,Django Admin,考虑一个每天一个单词的Django Web应用程序,它每天向用户提供一个词汇单词,这个单词的难度从周一的普通单词增加到周五的晦涩单词 models.py中的模型如下所示: class WordADay(models.Model): """A vocabulary word and its assigned day""" date = models.DateField( help_text="The date to post the selected word"
class WordADay(models.Model):
"""A vocabulary word and its assigned day"""
date = models.DateField(
help_text="The date to post the selected word"
)
word = models.ForeignKey(
Words,
help_text="The selected vocabulary word"
)
class Word(models.Model):
"""Vocabulary words"""
OBSCURITY_CHOICES = [(1,'Monday'),
(2,'Tuesday'),
(3,'Wednesday'),
(4,'Thursday'),
(5,'Friday')]
word = models.CharField(
max_length=32,
help_text="A vocabulary word"
)
difficulty = models.PositiveSmallIntegerField(
choices=OBSCURITY_CHOICES,
help_text="How obscure the word is"
)
在WordADay模型的管理添加页面上,我希望能够首先从“日期”字段的标准日历选择器中选择一天。选择后,我希望“word”字段的下拉选择器中的选项将自动筛选为仅具有正确难度的word模型实例,其中1对应于星期一日期,5对应于星期五日期。也就是说,我想根据为不同字段选择的值过滤外键选项
为了便于讨论,我可以提供一个框架admin.py
当然它还不完整,因为我不知道该放什么进去
经过几个小时的文档挖掘,我发现了这个财产,描述为
设置list_filter以激活管理员更改列表页面右侧栏中的筛选器
这不是我想要的;我希望在添加页面上有一个过滤器,而不是更改页面,我不希望有一个侧栏,我希望一旦选择了日期,过滤器就会自动运行
如果不从头创建一个新的AdminSite,这是可能的吗?django admin中没有任何内置功能可以做这件事。但是,您不必从头开始创建一个全新的管理站点 最好的方法是使用javascript更新相关表单值的值。您需要在其中一个输入的更改事件上添加一个事件列表器,并将其设置为更新另一个 因为django admin在一两个地方使用jquery,所以您可以免费访问jquery,或者只使用普通javascript就可以相对容易地做到这一点 关于如何将javascript附加到此页面,您有两个选项: 通过modelAdmin加载javascript 扩展模板。 然后在my_template.html中
第二个选项的优点是,您可以根据通过上下文加载的值更改脚本,但这可能不是必需的。我想将其添加到“添加”页面,而不是“更改”页面。这两个模板是否都是相同的模板change\u form.html?@DarienMarks还有一个add\u form\u template属性,但我相信如果不设置,将使用change\u form\u模板。好的,谢谢!我需要一点时间来实现这一点,当我有结果时会回来。我可以确认这两种方法都有效。我试了2次。最初,但正如您在回答中所描述的,使用日历选择器会带来额外的JavaScript复杂性。我最终用方法1使它工作得更顺利。应用于新的小部件。再次感谢!你不仅仅是威克洛姆:很高兴你成功了
from django.contrib import admin
from .models import WordADay, Word
from django.db import models
@admin.register(WordADay)
class WordADayAdmin(admin.ModelAdmin):
pass
@admin.register(Word)
class WordAdmin(admin.ModelAdmin):
pass
class MyAdmin(admin.ModelAdmin):
class Media:
js = ('js/my_script.js', ) # this should be a file from your static directory
class MyAdmin(admin.ModelAdmin):
change_form_template = "my_template.html"
{% extends "admin/change_form.html" %}
{% block %}
{% block extrahead %}
{{ block.super }}
... add your script here
{% endblock %}