Django admin 下拉菜单依赖不会加载

Django admin drop down menu dependent won't load

提问人:LM_IT 提问时间:11/2/2023 更新时间:11/9/2023 访问量:28

问:

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

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

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

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

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

Models.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)

Admin.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 调用 somewehere,并在测试日志中确定请求(顺便说一句,我手动测试了请求并成功)。

有什么新的想法吗?

谢谢

jquery django ajax 下拉菜单 cascadingdropdown

评论


答:

0赞 LM_IT 11/9/2023 #1

这是函数名称的引用错误。多亏了这个其他帖子和控制台日志,才解决了。