gpt4 book ai didi

javascript - Django/jQuery 在管理中级联选择框

转载 作者:行者123 更新时间:2023-11-28 07:36:20 28 4
gpt4 key购买 nike

我有一个 Contract 类,其中 contract_mod 允许扩展前一个合约。 contract_mod 应仅显示与我们之前选择的人员相关的契约(Contract)。Contract 类返回字段 person。由于我从未使用过 AJAX/jQuery,所以我不知道从哪里开始。

因此,我的目标是字段 contract_mod 取决于字段 person(使用管理界面)。

class Contract(models.Model):
person = models.ForeignKey(Person) #person hired
contract_mod = models.OneToOneField('self', blank = True, null = True) #allows to extend a contract
...

由于字段contract_mod是OneToOneField,我无法使用django-smart-selects或django-ajax-select

最佳答案

在类似的情况下,我执行了以下操作(现在已适应您的模型):

型号

class Person(models.Model):
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
def get_name(self):
return self.name

class Contract(models.Model):
person = models.ForeignKey(Person) #person hired
contract_mod = models.OneToOneField('self', blank = True, null = True)
contract_name = models.CharField(max_length=20) #just for testing

def __unicode__(self):
return self.get_name() + " " +self.contract_name
def get_name(self):
return self.person.get_name() #to make sure you get the person name in the admin
def contract_mod_name(self):
if self.contract_mod:
return self.contract_mod.contract_name
else:
return ""

管理员

class SelectField(forms.ChoiceField):
def clean(self, value):
return value

class CForm(forms.ModelForm):
contracts_from_selected = SelectField()
class Meta:
model = Contract
widgets = { 'contract_mod' : forms.widgets.Select(attrs={'hidden' : 'true'}) }

class CAdmin(admin.ModelAdmin):
form = CForm
list_display = ('contract_name','get_name','contract_mod_name')#what you like
def save_model(self, request, obj, form, change):
if request.POST.get('contracts_from_selected'):
obj.contract_mod=Contract.objects.get(id=int(request.POST.get('contracts_from_selected')))

obj.save()

覆盖change_form.html模板(通过将其从django/contrib/admin/templates/admin复制到yourapp/templates/admin/yourapp目录中)并添加以下Javascript:

$(function () {
$("#id_person").change(function () {
var options = $("#id_contract_mod option").filter(function () {
return $(this).html().split(" ")[0] === $("#id_person option:selected").html();
}).clone();
$("#id_contracts_from_selected").empty();
$("#id_contracts_from_selected").append(options);
});
});

一个缺点是,它使用可见的 html 条目来存储人-契约(Contract)关系。因此该人也在下拉列表中可见。为了避免这种情况,您可以向选项添加一个属性 - 请参阅此处: Django form field choices, adding an attribute

是的,最好完全隐藏contract_mod ChoiceField。通过小部件中的hidden=True,仅隐藏下拉列表。

关于javascript - Django/jQuery 在管理中级联选择框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28540485/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com