2012-06-24 3 views
0

je 3 modèles liés à une clé étrangère:formes django - ou valider sur le terrain de remplissage automatique basé sur la valeur autre domaine

class Region(models.Model): 
    name = models.CharField(max_length=20) 

class Zipcode(models.Model): 
    zipcode = models.IntegerField() 
    name = models.CharField(max_length=20) 
    region = models.ForeignKey(Region) 

class Address(models.Model): 
    street = models.Charfield(max_length=40) 
    zipcode = models.ForeignKey(Zipcode) 
    region = models.ForeignKey(Region) 

Dans une prochaine étape, je fis un formulaire basé sur le modèle Address.

Maintenant, je voudrais remplir automatiquement le champ region lorsque l'utilisateur remplit le champ zipcode.

Je sais qu'il est possible de calculer les valeurs dans le backend, etc., mais est-il possible de compléter le champ region presque en temps réel lorsque l'utilisateur sélectionne le champ zipcode? D'une manière qui est également visible dans le formulaire pour l'utilisateur?

Merci!

Répondre

0

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

+0

Merci Joe pour les commentaires! Je vais essayer le conseil. Cordialement. –

Questions connexes