Могу ли я автоматически фильтровать параметры на странице Django Admin "добавить"? - PullRequest
0 голосов
/ 29 мая 2020

Рассмотрим веб-приложение Word-A-Day Django, которое каждый день представляет пользователю словарное слово, при этом сложность слова возрастает с «обычного» в понедельник до «неясного» в пятницу.

Модели в 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

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

хотя, конечно, он не полный, потому что я не знаю, что в него вставлять.

Через пару часов копания в документации я обнаружил свойство list_filter, описанное как

Установить list_filter для активации фильтров в правой боковой панели страницы списка изменений администратора

Это не то, что я хочу; Мне нужен фильтр на странице «добавить», а не на странице «изменить», и мне не нужна боковая панель, я хочу, чтобы фильтр был автоматически c после выбора даты.

Это это возможно без создания нового AdminSite с нуля?

1 Ответ

1 голос
/ 02 июня 2020

Это не то, что нужно делать встроенным функциям в django -admin. Однако вам не придется использовать go, чтобы создать совершенно новый сайт администратора с нуля.

Лучшим способом сделать это было бы использовать javascript для обновления значений соответствующие значения формы. Вам нужно будет добавить список событий для события изменения одного из ваших входов и настроить его для обновления другого.

Поскольку django -admin использует jquery в одном или двух местах, у вас есть доступ к jquery бесплатно, или это относительно легко сделать с помощью простого javascript.

Что касается того, как вы прикрепляете javascript к этой странице, у вас есть два варианта:

  1. загрузить javascript через вашу модельAdmin)
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"

затем в my_template.html

{% extends "admin/change_form.html" %}
{% block %}
{% block extrahead %}
{{ block.super }}
  ... add your script here
{% endblock %}

Преимущество второго варианта состоит в том, что вы можете изменить свой скрипт на основе загруженных значений в сквозном контексте, но это может быть необязательно.

...