Je pense que vous aurez besoin d'une sorte de recherche ajax pour cela. Par exemple, javascript (je suggère jquery) serait réglé pour faire une requête ajax chaque fois que quelqu'un a entré un code postal. Peut-être que si la longueur de la zone de texte du code postal est six, alors l'événement onChange demandera l'url "/ ajax/get_region/60604 /" qui correspondra à la vue ci-dessous et transmettra le code postal. La vue peut renvoyer une réponse json qui indiquerait la région pour ce code postal. Enfin, dans la fonction de rappel javascript pourrait mettre à jour la boîte de dialogue sur votre site pour indiquer la région.
Ma recommandation est que la région n'aurait même pas besoin d'être publiée sur le serveur web .... la recherche ajax ici ne serait utilisée qu'à des fins d'affichage et ensuite elle serait calculée à nouveau pendant le POST. Mais, encore une fois, je ne sais pas si vous voulez que l'utilisateur puisse entrer manuellement à la fois la région et le code postal.
views.py
import json
from django.http import HttpResponse
def ajax_region_from_zip(request, zip):
# do your logic to lookup the zipcode from the region
region, lookup_success = get_region_form_zip(zip)
response = Response(content_type='application/json')
response.write(json.dumps({"success":lookup_success, "region":region))
return response
Enfin, si vous ne voulez que l'utilisateur de pouvoir modifier à la fois région et code postal sous la forme, vous voulez vous assurer que la région et la Les codes postaux sont toujours cohérents et vous pouvez créer une vérification dans le formulaire que l'utilisateur soumet. En outre, si l'utilisateur désactive le javascript, vous devez fournir une erreur à l'utilisateur s'il sélectionne la mauvaise région. Vous pouvez remplacer la méthode clean() sur le formulaire qui recherche également la région à partir du code postal. Si elle ne correspond pas à la région qui a été publiée par le formulaire frontal, il retournera un message d'erreur.
forms.py
class AddressForm(forms.ModelForm):
....
....
def clean(self):
cleaned_data = self.cleaned_data
zip = cleaned_data.get('zip', None)
region = cleaned_data.get('region', None)
region_lookup, lookup_success = get_region_form_zip(zip)
if not region == region_lookup:
forms.ValidationError("This zipcode is not in the given region.")
return cleaned_data
Remarque, ces exemples de code, n'ont pas été testés, mais nous espérons faire passer l'idée.
Hope this helps,
Joe
Merci Joe pour les commentaires! Je vais essayer le conseil. Cordialement. –