首先,我知道还有其他关于该主题的帖子,但到目前为止没有一个对我有用,因此我在这里恳请您的帮助。
任务很简单:在 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调用并在测试日志中定义请求(顺便说一句,我手动测试成功了该请求)。
有什么新鲜的想法吗?
谢谢你
这是函数名称的引用错误。感谢另一篇文章和控制台日志解决了。