python - 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 表单的情况下向表单传达更新的最佳方式。
提前致谢!
解决方案
我想通了,不得不使用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);
}
}
);
}
}
);
也不得不使用其他一些技巧。但很高兴去!
推荐阅读
- c++ - const_cast 在常量表达式中有效吗?(C++14, C++17)
- javascript - 对象破坏 ES6 类
- flutter - 我可以使用哪个小部件来拥有这样的图像?
- c# - 通过 C# 打开 Windows Powershell
- gremlin - 如何在 Gremlin 3.4.0 中返回顶点属性的元属性
- python - 如何向 OpenCV 函数 cv.dft() 输入复数值?
- swift - 如何在 Swift 中使用泛型更正实现提供者逻辑
- android - 如何在没有用户交互的情况下从我的应用程序读取安装在 android 设备中的 .pem 和 .p12 证书
- mysql - 删除表/数据库时仍然错误“定义了多个主键”
- rust - 在 `#![no_std]` 模式下是否可以解除恐慌?