我想使用Model在Django中构建一个多级下拉层次结构。信息应该是动态更新而不重新加载页面。我知道我应该使用Ajax,但是可以从以下模型生成模板:< / p>
class Pays(models.Model):
nom_pays=models.CharField(max_length=45)
def__str__(self):
return self.nom_pays
class Province(models.Model):
nom_province=models.CharField(max_length=100)
pays=models.ForeignKey(Pays,on_delete=models.CASCADE)
def__str__(self):
return self.nom_province
class Ville(models.Model):
nom_ville=models.CharField(max_length=100)
province=models.ForeignKey(Province,on_delete=models.CASCADE)
def__str__(self):
return self.nom_ville
class Commune(models.Model):
nom_commune=models.CharField(max_length=100)
ville=models.ForeignKey(Ville,on_delete=models.CASCADE)
def__str__(self):
return self.nom_commune
可以从django模型表单生成该模型,或者我应该用HTML创建manualy表单?
答案 0 :(得分:1)
首先,你必须知道,我们不使用模型形式,因为它是唯一的做事方式。目的是获得时间。因此,所有这些工作人员都不是不可能的。当我面对这些时,我总是手动构建表单,但只填充层次结构的第一个或最高模型,而对于其他模型,我将使用Ajax。例如:
def myController(request):
#To have the list of all you pays
pays=Pays.objects.all()
#Here you pass your pays object in your form template by a dictionnary
return render(request,"template/your_form_template.html",{"your_dic_variable":pays})
然后在你的模板中:
<select name="myChoice" id="choice">
{% for pays in your_dic_variable %}
<option value={{ pays.id }}>{{ pays.nom }}</option>
{% endfor %}
</select>
....
如果你有另一个选项,你可以调用onChange()
方法发送一个Ajax请求来动态更新下面的dropown。正如你所说,如果你知道使用Ajax,你会有这样的事情:
$(function(){
$('#choice')change(function()
{
//you can send ajax somewhere here
});
});
或者,另一个想法是,想象有3个这样的模型:
class FirstModel(models.model):
field_m1=models.CharField(max_length=20)
class SecondModel(models.model):
field_m2=models.CharField(max_length=20)
first_model=models.ForeignKey(FirstModel,on_delete=models.CASCADE)
class ThirdModel(models.model):
field_m3=models.CharField(max_length=20)
field2=models.CharField(max_length=20)
field3=models.CharField(max_length=20)
second_model=models.ForeignKey(SecondModel,on_delete=models.CASCADE)
与ThirdModel
中依赖于之前2个模型的字段second_model
一样,您可以使用模型表单只包含3个字段:fields_m3
,field2
和field3
。它们将自动生成:
class ThirdModelForm(froms.ModelForm):
class Meta:
model=ThirdModel
fields=['fields_m3','field2','field3']
在你的模板中,你会这样做:
<form>
{{ csrf_token }}
<!-- Data form first model,but you must have a controller send send the data -->
<select id="choice">
{% for f_model in your_dic_variable %}
<option value={{ f.id }}>{{ f.column }}</option>
{% endfor %}
</select>
<!-- second model will be populated with ajax form the choice1 id -->
<select id="choice2">
{% for f_model in your_dic_variable %}
<option value={{ f.id }}>{{ f.column }}</option>
{% endfor %}
</select>
<!-- second dropdown will be populated with ajax form the choice1 id -->
<select id="choice2">
<!-- data here will come from ajax according to the first model id value -->
</select>
<!-- third dropdown will be populated with ajax form the choice2 id,and it is the second_model field of ThirdModel data -->
<select id="choice2">
<!-- data here will come from ajax according to the second model id value -->
</select>
{{ ourform.as_p }}
<button type='submit'>Record</button>
</form>
我也做到了,而且效果很好