Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Django/jQuery在Admin中级联选择框_Javascript_Jquery_Ajax_Django_Django Admin - Fatal编程技术网

Javascript Django/jQuery在Admin中级联选择框

Javascript Django/jQuery在Admin中级联选择框,javascript,jquery,ajax,django,django-admin,Javascript,Jquery,Ajax,Django,Django Admin,我有一个Contract类,Contract_mod允许从上一个合同扩展一个合同。合同\ mod应仅显示与我们先前选择的人员相关的合同。 Contract类返回字段person。由于我从未使用过AJAX/jQuery,我不知道从哪里开始 因此,我的目标是现场合同取决于使用管理界面的现场人员 class Contract(models.Model): person = models.ForeignKey(Person) #person hired contract_m

我有一个Contract类,Contract_mod允许从上一个合同扩展一个合同。合同\ mod应仅显示与我们先前选择的人员相关的合同。 Contract类返回字段person。由于我从未使用过AJAX/jQuery,我不知道从哪里开始

因此,我的目标是现场合同取决于使用管理界面的现场人员

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

由于field contract_mod是OneToOneField,我不能在类似的情况下使用django smart select或django ajax select,我现在根据您的模型做了以下调整:

模型 管理 通过将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条目来存储人员-合同关系。因此,在下拉列表中也可以看到此人。要避免这种情况,您可以改为向选项添加属性-请参见此处:


是的,最好把合同完全隐藏起来。通过小部件中的hidden=True,只有下拉列表是隐藏的。

它没有显示任何错误,但还不起作用。当我使用Grapelli时,我从它的表单中获取了change_表单,并且在Javascript的一部分中添加了函数,我应该将它放在其他地方吗?不管怎样,很高兴知道我并不孤单:如果我不隐藏小部件,我可以看到它是空的@如果为空,Javascript可能无法工作。您是否可以检查浏览器是否找到Javascript,例如Firebug,或者取决于您使用的浏览器?我还没有和格拉佩利合作过。我把它放在模板的底部,就在最后的{%endblock%}语句之前。它可以工作,但在字段contracts\u from\u selected not in contract\u modYes中显示名称,这就是它背后的想法。有效的选择选项将从所选表单字段加载到合同中。
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()
$(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);
    });
});