2017-08-13 26 views
5

Chciałbym zbudować wielopoziomową hierarchii rozwijanej w Django przy użyciu Models.A informacje powinny być aktualizowane dynamicznie bez ponownego ładowania strony. Wiem, że powinienem używać Ajax, ale jest to możliwe, aby wygenerować szablon z następujących modeli:Chciałbym wygenerować 4 poziomy rozwijanej formularza przy użyciu formularzy modelu django

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 

jest to możliwe, aby wygenerować ten model od modelu django formularzy lub należy utworzyć manualy formularzy z HTML?

Odpowiedz

1

Po pierwsze, musisz wiedzieć, że nie używamy modeli formularzy, ponieważ jest to jedyny sposób na robienie rzeczy. Celem jest zysk czasu. Więc nie jest niemożliwe, aby zrobić wszystkie te manuallly.Personally, kiedy mam do czynienia z tymi rodzaju sytuacjach i sprecyzowane zbudować formę wypełnić ręcznie, ale tylko pierwszy lub najwyższy model hierarchii, a dla innych, użyję Ajax.For przykład:

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}) 

a potem w szablonie:

<select name="myChoice" id="choice"> 
{% for pays in your_dic_variable %} 
    <option value={{ pays.id }}>{{ pays.nom }}</option> 
{% endfor %} 
</select> 
.... 

Jeśli masz inną opcję, możesz zadzwonić pod numer onChange() Methode wysłania żądania Ajax do aktualizacji dynamicznie następujące dropown.As Mówiłeś, jeśli wiesz używać Ajax, będziesz miał coś takiego:

$(function(){ 
    $('#choice')change(function() 
{ 
    //you can send ajax somewhere here 
}); 
}); 

Albo inna idea jest taka, że ​​sobie wyobrazić 3 modele mają tak:

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) 

jak w ThirdModel dziedzinach, które zależy od 2 poprzednich modeli jest second_model, można użyć wzorów formularzy mieć tylko 3 pola: fields_m3, field2 i field3 zostaną wygenerowane .They auto:

class ThirdModelForm(froms.ModelForm): 
    class Meta: 
     model=ThirdModel 
     fields=['fields_m3','field2','field3'] 

A w szablonie zrobisz tak:

<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> 

Ja również zrobić to i to działa doskonale

+0

Jesteś najlepszy, druga metoda działa doskonale – lislis