2010-01-11 2 views
0

Je cherche à implémenter un champ de code postal dans django en utilisant les objets de formulaire de localflavor, mais pas tout à fait de les faire fonctionner. Je veux avoir un champ de code postal dans un formulaire (ou ModelForm dans mon cas), mais les champs ne valident jamais en tant que code postal lors de l'appel de _get_errors() sur l'objet de formulaire. La façon dont je suis en train de l'appliquer me semble juste, mais est apparemment fausse, est-ce que quelqu'un sait quelle pourrait être la bonne façon de le faire?Implémentation de USZipCodeField et USStateField dans django

J'ai un ModelForm que je veux utiliser code postal (et aussi USStateField) dans:

from django.contrib.localflavor.us.forms import USStateField 
from django.contrib.localflavor.us.forms import USZipCodeField 

class FooForm(ModelForm): 
    class Meta: 
     model = Bar 
     fields = ('address', #This form uses a subset of fields from the model 
        'address_apt', 
        'address_city', 
        'address_state', 
        'address_zip', 
        'home_phone', 
        'mobile_phone') 
     widgets= { 
        'address_zip' : USZipCodeField(), 
        'address_state' : USStateField(), 
       } 

Le ModelForm liens 'FooForm' à un modèle qui ressemble à:

from django.contrib.localflavor.us import models as usmodels 

class Bar(models.Model): 
    db_table = 'BAR' 

    address     = models.CharField(max_length=255) 
    address_apt    = models.CharField(max_length=40, blank=True) 
    address_city   = models.CharField(max_length=90) 
    address_state   = usmodels.USStateField() 
    address_zip    = models.CharField(max_length=15) 
    home_phone    = usmodels.PhoneNumberField() 
    mobile_phone   = usmodels.PhoneNumberField() 
    #... There are more fields in the model... 

Mais si Je crée une instance du formulaire et exécute sa validation, il ne se soucie jamais de la validation au niveau du formulaire, seulement la validation au niveau du modèle:

foo_instance = FooForm(request.POST) 
#Let's assume request.POST looks like: 
#<QueryDict: {u'address_city': [u'asdf'], u'mobile_phone': [u'asdf'], u'address_state': [u'California'], u'home_phone': [u'asdf'], [u'1'], u'address': [u'123 foo'], u'address_zip': [u'asdf']}> 

foo_instance._get_errors() Rendement:

<ul class="errorlist"> 
<li>mobile_phone<ul class="errorlist"> 
<li>Phone numbers must be in XXX-XXX-XXXX format.</li></ul> 
</li><li>home_phone<ul class="errorlist"> 
<li>Phone numbers must be in XXX-XXX-XXXX format.</li></ul> 
</li></ul> 

je dois être en mesure d'appeler la validation sur l'objet sous forme peuplée et l'ont me dire que le code postal est formatté correctement le cas échéant. Faire quelque chose de mal, je ne sais pas ce que atm.

Répondre

1

L'utilisation de widgets a littéralement été simplement ajoutée à la version SVN du trunk au cours de la dernière journée. Si vous utilisez une extraction plus ancienne, ou une version validée, cela ne fonctionnera pas - vous devrez revenir à l'ancienne façon de procéder, en remplaçant les déclarations de champ au niveau supérieur du formulaire.

+0

Ouais bonne prise, c'est à peu près ce qui se passe ici. Je suis sur 1.1. Quand je navigue dans la documentation venant de google, c'est par défaut les docs de développement doivent donc être plus prudent: P ... Bravo à l'équipe de développement de django pour avoir ajouté la documentation en parallèle avec la fonctionnalité :) – Purrell

Questions connexes