Vous pouvez définir un champ caché pour avoir la valeur "state" réelle, puis utiliser jQuery pour créer la liste <select>
et, sur .select()
, copier sa valeur dans le champ caché. Ensuite, au chargement de la page, votre code jQuery peut extraire la valeur du champ masqué et l'utiliser pour sélectionner le bon élément dans l'élément <select>
après son remplissage.
Le concept clé ici est que le menu contextuel État est une fiction créée entièrement dans jQuery et ne faisant pas partie du formulaire Django. Cela vous donne un contrôle total sur elle, tout en laissant tous les autres champs fonctionner normalement.
EDIT: Il existe une autre façon de le faire, mais il n'utilise pas les classes de formulaire de Django.
De l'avis:
context = {'state': None, 'countries': Country.objects.all().order_by('name')}
if 'country' in request.POST:
context['country'] = request.POST['country']
context['states'] = State.objects.filter(
country=context['country']).order_by('name')
if 'state' in request.POST:
context['state'] = request.POST['state']
else:
context['states'] = []
context['country'] = None
# ...Set the rest of the Context here...
return render_to_response("addressform.html", context)
Ensuite, dans le modèle:
<select name="country" id="select_country">
{% for c in countries %}
<option value="{{ c.val }}"{% ifequal c.val country %} selected="selected"{% endifequal %}>{{ c.name }}</option>
{% endfor %}
</select>
<select name="state" id="select_state">
{% for s in states %}
<option value="{{ s.val }}"{% ifequal s.val state %} selected="selected"{% endifequal %}>{{ s.name }}</option>
{% endfor %}
</select>
Vous aurez également besoin de JavaScript habituel pour recharger le sélecteur d'états lorsque le pays est changé.
Je n'ai pas testé cela, donc il y a probablement quelques trous dedans, mais ça devrait faire passer l'idée.
Ainsi, vos choix sont:
- Utilisez un champ caché sous la forme Django pour la valeur réelle et ont les menus de sélection créés côté client via AJAX, ou
- Ditch stuff formulaire de Django et initialiser le menus vous-même.
- Créer un custom Django form widget, que je n'ai pas fait et donc ne commenterai pas. Je n'ai aucune idée si cela est faisable, mais il semble que vous aurez besoin d'un couple
Select
dans un MultiWidget
, ce dernier étant non documenté dans les documents réguliers, de sorte que vous aurez à lire la source.
essayer cette https://github.com/digi604/django-smart-selects/ –