Цепной выбор / зависимый раскрывающийся список в Django Admin - PullRequest
0 голосов
/ 18 октября 2018

У меня есть модель в Django, Модель A. Очень типичная, она имеет различные поля, некоторые поля выбора, некоторые логические, некоторые символьные поля.

У меня есть другая модель, Модель B, в этой модели,Предполагаемая функциональность заключается в том, что в Django Admin первое поле является выбором, где пользователь может выбрать любое поле, существующее в модели A. Это уже реализовано.Мне нужна помощь в выяснении, как сделать так, чтобы второе поле модели B имитировало параметры модели A.

Если у модели A есть поле выбора с именем «Мясо», и оно выбирается «Говядина, Турция,and Chicken ', если пользователь, добавляющий запись в Model B, выбирает' Meat 'в поле 1, поле 2 будет полем выбора с' Beef, Turkey and Chicken '.

Если Model A имеет символполе с именем «Все что угодно», если пользователь, добавляющий запись в модель B, выбирает «поле с чем угодно» в поле 1, поле 2 будет стандартным полем для ввода текста.

Если модель А является логическим полем с именем«Да / Нет», если пользователь, добавляющий запись в Модель B, выбирает «Да / Нет» в поле 1, поле 2 будет стандартным логическим полем выбора.

Я считаю, что главное, что я ищудля справки есть возможность написать собственный код для связанного выпадающего списка выбора / зависимости, который не включает в себя предварительно реализованные отношения «многие ко многим» или «внешний ключ».

Я не уверен, чтобиблиотеки в настоящее время поддерживаются в Django 2это было бы хорошей отправной точкой, или как я мог бы сам написать какой-то Ajax, который работает с администратором.

- РЕДАКТИРОВАТЬ -

Это выглядит как лучший способсправиться с этим, используя django-autocomplete-light.

URLS

re_path(r'^post-new-text/$', 
views.PostNewTextView.as_view(), 
name='post-new-text')

FORMS

class PostNormalizeForm(forms.ModelForm):
class Meta:
    model = PostNormalize
    widgets = {
        'new_text': autocomplete.ListSelect2(url='post-new-text', forward=['target_field', 'check_field'])
    }

    fields = ('__all__')

VIEWS

class PostNewTextView(autocomplete.Select2ListView):
    def get_list(self):
        target_field = self.forwarded.get('target_field', None)
        check_field = self.forwarded.get('check_field', None)

        if target_field == 'self':
            target_field = check_field

        choice_list = [str(choice[0]) for choice in Post._meta.get_field(target_field).choices]

        return choice_list

По сути, вы пишетеваш собственный возврат на основе списка для autocomplete.Select2ListView с использованием перенаправленных входных данных.В примере Post - это модель A, а PostNormalize - это модель B.

На данном этапе осталось выяснить, что если перенаправленное поле не является полем выбора, как разрешить свободный вход вполе new_text.

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