J'ai un formulaire pour l'adresse. L'un des champs est pour le pays de l'adresse. Actuellement, il ne s'agit que d'une zone de texte. Je voudrais une liste déroulante (des pays ISO 3166) pour cela. Je suis un débutant à Django, je n'ai donc même pas encore utilisé de widget Django Select. Quel est un bon moyen de faire cela?
Coder en dur les choix dans un fichier quelque part? Les mettre dans la base de données? Dans le modèle?
Nous avons fini par utiliser l'extrait ci-dessous, qui définit fondamentalement un nuplet de nuplets de codes de pays à deux caractères. De plus, il définit un type de champ personnalisé appelé CountryField et attribue par défaut le paramètre choice au tuple défini ci-dessus. Ceci est automatiquement rendu sous forme de liste déroulante.
Consultez le paramètre " choices " d'un CharField.
Vous voudrez peut-être aussi jeter un oeil à Django-countries .
from Django_countries.fields import CountryField
class Foo(models.Model):
country = CountryField()
Pays Django
from Django_countries.countries import COUNTRIES
class CountryForm(forms.Form):
country= forms.ChoiceField(COUNTRIES)
Deux projets bas maintenus:
http://code.google.com/p/Django-countries/
https://github.com/strange/Django-country-utils
Deux extraits:
http://djangosnippets.org/snippets/494/
http://djangosnippets.org/snippets/1476/
Pour l'instant, je vais chercher un extrait.
Voici une bibliothèque de Nice avec les pays (et pas seulement): pycountry
Son principal avantage est qu’il encapsule le paquet Debian pkg-isocodes (permet donc de le mettre à jour automatiquement) par rapport aux pays codés en dur dans d’autres solutions. Il a aussi des traductions.
Ainsi, si un nouveau pays apparaît ou si des pays existants sont fusionnés, vous n'avez pas besoin de changer votre code.
J'ai trouvé utile d'utiliser cette bibliothèque et de créer une application Django simple avec le modèle Country par exemple
Vous pouvez ensuite renseigner et tenir à jour votre table 'pays' à l'aide de la commande personnalisée Django-admin, comme décrit ci-après: Écriture des commandes personnalisées Django-admin
Comme indiqué dans les réponses précédentes, il existe une CountryField
dans Django-countries
. C'est un champ modèle.
Si un champ de formulaire est nécessaire dans un formulaire simple (et non dans un modèle), dans Django-countries
v3.x (testé définitivement dans 3.3), les éléments suivants peuvent être utilisés:
from Django_countries.data import COUNTRIES
class MyForm(forms.Form):
country = forms.ChoiceField(sorted(COUNTRIES.items()))
Lien vers le package: Django-countries
Si vous cherchez comment le faire sous des formes:
$ pip install Django-countries
>>> from Django_countries.data import COUNTRIES
>>> Country = forms.ChoiceField(choices = sorted(COUNTRIES.items()))
Les mettre dans la base de données est un meilleur moyen. Pratique pour la gestion.
Je l'ai résolu en utilisant multiple=True
:
from Django_countries.fields import CountryField
class UserProfile(models.Model):
countries = CountryField(multiple=True)
Vous pouvez en savoir plus à ce sujet dans la documentation:
Voici la solution:
from Django_countries.fields import CountryField
class Foo(TimeStampedModel):
country = CountryField()