我想使用django模型表单生成4级下拉表单

时间:2017-08-13 16:11:57

标签: python ajax django

我想使用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表单?

1 个答案:

答案 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_m3field2field3。它们将自动生成:

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>

我也做到了,而且效果很好