首页 > 解决方案 > django ModelForm 动态查找基于同一表单中的另一个字段

问题描述

所以我有这些模型:

class Employee(models.Model):
    ACTIVE = 'A'
    INACTIVE = 'I'
    TERMINATED = 'T'
    STATUS_OPTIONS = (
        (ACTIVE, 'Active'),
        (INACTIVE, 'Inactive'),
        (TERMINATED, 'Terminated'),
    )
    number = models.CharField(max_length=50, unique=True)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    status = models.CharField(max_length=1, choices=STATUS_OPTIONS, default=ACTIVE)
    is_supervisor = models.BooleanField(default=False)
    supervisor = models.ForeignKey('self', blank=True, null=True, on_delete=models.SET_NULL, related_name='employee_supervisor')

class Receipt(models.Model):
    Supervisor = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='receipt_supervisor')
    Employee = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='receipt_employee')
    amount = models.DecimalField(max_digits=6, decimal_places=2, blank=False, null=False)
    reimbursed_on = models.DateField(blank=True, null=True)
    receipt_copy = models.FileField(upload_to='receipt_uploads/', null=False, blank=False)

您会注意到 Receipt 类对 Employee 类具有双重外键。作为员工也可以是主管。

形式:

class ReceiptForm(forms.ModelForm):
    class Meta:
        model = Receipt
        fields = [
            'Supervisor',
            'Employee',
            'amount',
            'receipt_copy'
        ]
        widgets = {}

    def __init__(self, *args, **kwargs):
        super(ReceiptForm, self).__init__(*args, **kwargs)
        self.fields['Supervisor'].queryset = Employee.objects.filter(status='A', is_supervisor=True)
        self.fields['Employee'].queryset = Employee.objects.filter(status='A') # Dynamic Filter Me...

所以在我的雇员表数据中有一堆雇员,其中一些是主管。大多数员工与另一位称为主管的员工有关系。

看法:

def add_receipt(request):
    form = ReceiptForm(request.POST or None)
    if form.is_valid():
        form.save()
        form = ReceiptForm()
    title = 'Add Receipt'
    context = {
        'title': title,
        'form': form
    }
    return render(request, "receipts/add.html", context)

我正在寻找一种方法,当您在表单中选择您的主管时,员工查询集被动态过滤以仅列出与该主管相关的员工。

我需要在客户端执行此操作吗,JS / AJAX?我假设我需要调用某种 GET 或 POST 函数。我只是不确定在不提交 django 表单的情况下向表单传达更新的最佳方式。

提前致谢!

标签: pythondjangodynamicdjango-forms

解决方案


我想通了,不得不使用AJAX。

$("#id_Supervisor").change(
    function () {
        var url = $("#receiptForm").attr("data-employees-url");
        var supervisorId = $(this).val();
        if (supervisorId === '') {
            $("#id_Employee").html("<option value=\"\" selected>---------</option>");
        } else {
            $.ajax(
                {
                    url: url,
                    data: {
                        'Supervisor': supervisorId
                    },
                    success: function (data) {
                        $("#id_Employee").html(data);
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        alert("Status: " + textStatus + "\nError: " + errorThrown);
                        $("#id_Employee").html(null);
                    }
                }
            );
        }
    }
);

这帮助我弄清楚了:https ://simpleisbetterthancomplex.com/tutorial/2018/01/29/how-to-implement-dependent-or-chained-dropdown-list-with-django.html

也不得不使用其他一些技巧。但很高兴去!


推荐阅读