Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在Django管理“添加”页面上自动筛选选项吗?_Django_Django Admin - Fatal编程技术网

我可以在Django管理“添加”页面上自动筛选选项吗?

我可以在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"

考虑一个每天一个单词的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"
    )
    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 %}