Django 管理下拉菜单依赖项将无法加载

问题描述 投票:0回答:1

首先,我知道还有其他关于该主题的帖子,但到目前为止没有一个对我有用,因此我在这里恳请您的帮助。

任务很简单:在 Django Admin 中,我有一个带有下拉菜单的表单,其选择必须过滤并填写另一个下拉菜单。

首先,我尝试简单地将 jQuery 添加到表单中以获取字段选择的更改。 .js 与其他 Javascript 正确加载在一起,但当我在父下拉列表中进行选择时,什么也没有发生。

其次,我尝试在表单声明中添加小部件。与上面的结果相同。

以下是我最后一次尝试,结果如上:

模型.py

class Utenti(models.Model):
    nome = models.CharField(max_length = 188) 
    cognome = models.CharField(max_length = 188)
    dataNascita = models.DateField(max_length = 8, verbose_name = "Data di nascita")
    genere = models.CharField(max_length = 19, choices = generi, null = True, blank = True, verbose_name = "Genere")
    provincia = models.ForeignKey(Provincia, on_delete = models.SET_NULL, null = True)
    citta = models.ForeignKey(Comune, on_delete = models.SET_NULL, null = True, verbose_name = "Citta'")
    cf = models.CharField(max_length = 16, validators = [ validate_codice_fiscale ])
    

    class Meta:
        verbose_name = "Utente"
        verbose_name_plural = "Utenti"

    def __str__(self):
        return str(self.nome) + " " + str(self.cognome)

管理员.py

class FormUtenti(forms.ModelForm):
    class Meta:
        model = Utenti
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        province = [('','---------')] + [(i.codice_provincia, i.name) for i in Provincia.objects.all()]

        self.fields['citta'].queryset = Comune.objects.none()

        self.fields['provincia'].widget = forms.Select(
            attrs = {
                'onchange': 'filterCities(this.value);',
            },
            choices = province
        )

class UtentiAdmin(admin.ModelAdmin):
    form = FormUtenti

    class Media:
        js = (  
                'admin/js/jquery.init.js', // to verify script not launched before jQuery init
                'admin/js/getCities.js',   
             )

getCities.js

'use strict';
{
 const $ = django.jQuery;

 function filterCities(provincia_id){
    $.ajax({
            url:"/get_cities/",
            type:"POST",
            data:{provincia: provincia_id,},
            success: function(result) {
                this.alert(result);
                cls = document.getElementById("id_citta_select");
                cls.options.length = 0;
                for(var item in result) {
                    cls.options.add(new Option(item, result[item]));
                }
             },
             error: function(e) {
                 alert(JSON.stringify(e));
             },
    });
 }
}

views.py

def get_cities(request):
    test_request_log = TestRequestLog(test_request_message= request)
    test_request_log.save()
    provincia_id = request.POST.get('provincia')
    citta = Comune.objects.filter(provincia_id = provincia_id).order_by('name')
    return JsonResponse({
        "data": [{'citta': c.name} for c in citta],
    })

urls.py

    path('get_cities/', views.get_cities, name='get_cities'),

我很确定代码不会超出Javascript,否则我应该在某个地方看到ajax调用并在测试日志中定义请求(顺便说一句,我手动测试成功了该请求)。

有什么新鲜的想法吗?

谢谢你

jquery django ajax drop-down-menu cascadingdropdown
1个回答
0
投票

这是函数名称的引用错误。感谢另一篇文章和控制台日志解决了。

© www.soinside.com 2019 - 2024. All rights reserved.