【问题标题】:How to populate/filter a Select field dynamically from an other Select field inside the same formDJANGO - 如何从同一表单内的其他 Select 字段动态填充/过滤 Select 字段
【发布时间】:2021-03-22 03:36:51
【问题描述】:

使用 Javascript 函数编辑

我对 django 还是很陌生,但我在使用表单时遇到了一些问题。

目前我有一个包含 10 个字段的表单。但是,我正在寻找的是两个选择字段之间的特定内容。我希望通过选择第一个 Select 字段来过滤我的第二个 Select 字段。我的模型已连接到 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 中的一个顾问 ID(我们在模型中看不到它,它在推入数据库时​​会自动递增)

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 所做的是在 select 中选择被选中的顾问,但是我看不到如何获取 Mission 数据并对其进行过滤。

所以我想在单击 Select 字段时执行过滤器,然后将结果填充到我的第二个 Select 字段中。一个顾问有零个或 n 个任务,一个任务只有一个顾问。

这可能吗?我环顾四周,找到了复杂的答案(例如使用 kwargs CHOICES 但我不明白如果这是我想要的)django documentation

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    您需要编写 Javascript 代码来处理第一个选择字段上的click 事件

    A.检索可用选项并

    B.填充第二个选择字段。

    对于没有 Javascript 的解决方案,您需要将表单拆分为两个表单。提交第一个表单后,您可以计算第二个表单中选择字段的可用选项。

    【讨论】:

    • 我将添加细节,我已经尝试过使用 onClick 功能,但是我想如何从 Javascript 中检索数据?
    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 2019-12-02
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多