Как динамически заполнять / фильтровать поле выбора из другого поля выбора внутри той же формы

#python #django #django-forms

#python #django #django-forms

Вопрос:

Я довольно новичок в django, и у меня возникли некоторые проблемы с формой.

В настоящее время у меня есть форма, работающая с 10 полями. Однако то, что я ищу, зависит от двух полей выбора. Я хочу, чтобы мое второе поле выбора фильтровалось с выбором первого поля выбора. Мои модели подключены к bdd.

models.py

 class Mission(models.Model):
    fk_consultant = models.ForeignKey(Consultant, on_delete = models.PROTECT)
    manager = models.CharField(max_length = 3, blank = True, null = True)
    project_name = models.CharField(max_length = 50)

class Consultant(models.Model):
    matricule = models.CharField(max_length = 30, blank = True, unique = True)
    name = models.CharField(max_length = 50)
    first_name = models.CharField(max_length = 50)
    fk_teams_gestion = models.ManyToManyField(Team, related_name='gestion', blank=True)
 

Здесь fk_consultant соответствует идентификатору консультанта в Consultant (мы не видим его в модели, он автоматически увеличивается при вводе в базу данных)

forms.py

 class MissionForm(forms.ModelForm):
    def __init__(self, cslt, *args, **kwargs):
        super(MissionForm, self).__init__(*args, **kwargs)
        self.fields['fk_consultant'].widget = forms.Select(
            attrs={'class': "form-control", "onClick": "fillCsltInfo(this.id, value)"}, choices=[('', '')]   [(c.id, c) for c in cslt])
        self.fields['project_name'].widget = forms.Select(attrs={'class': "form-control"},
                                                        choices=[('', '')])

    class Meta:
        model = Mission
        fields = ['fk_consultant', project_name']
        labels = {
            'fk_consultant': "Consultant*",
            'project_name': "Name of the project*"

        widgets = {
            'fk_consultant': forms.Select(attrs={'class': "form-control"}),
            'project_name': forms.TextInput(attrs={'class': "form-control"})
        }
 

views.py

 mission_form = MissionForm(cslt, auto_id='id_start_%s') #where cslt is a list of Consultant model
 

myfile.js

 function fillCsltInfo(id, val){
    var form_start_project = document.getElementById('id_start_project_name');
    form_start_project.value= val;
}
 

Однако id использует выбранного консультанта в выборе, я не вижу, как получить данные миссии и отфильтровать их.

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

Возможно ли это? Я огляделся и нашел сложный ответ (например, с ВЫБОРОМ kwargs, но я не понимаю, это то, что я хочу) документация django

Комментарии:

1. Я думаю, вы ищете зависимые от django варианты, где выбор одного из них определяет варианты, показанные в будущем…

Ответ №1:

Вам нужно будет написать код Javascript для обработки click события в первом поле выбора, чтобы

A. извлеките доступные параметры и

B. заполните второе поле выбора.

Для решения без Javascript вам нужно будет разделить вашу форму на две формы. После отправки первой формы вы можете рассчитать доступные варианты выбора для поля выбора во второй форме.

Комментарии:

1. Я добавлю подробности, я уже пробовал использовать функцию onClick, но как я предполагаю получить данные из Javascript?