Django:国家下拉列表?

时间:2010-06-03 07:10:56

标签: django drop-down-menu django-forms country django-widget

我有一份地址信息表。其中一个字段是地址国家/地区。目前这只是一个文本框。我想要一个下拉列表(ISO 3166国家)。我是一个django新手,所以我还没有使用过Django Select小部件。有什么好办法呢?

在某个地方对文件中的选项进行硬编码?把它们放在数据库中?在模板中?

14 个答案:

答案 0 :(得分:32)

查看CharField的“choices”参数。

您可能还想查看django-countries

答案 1 :(得分:15)

Django Countries

from django_countries.fields import CountryField

class Foo(models.Model):
    country = CountryField()

答案 2 :(得分:9)

使用下面的片段结束,该片段基本上定义了两个字符国家/地区代码的元组元组。此外,它定义了一个名为CountryField的自定义字段类型,并将choices参数默认为上面定义的元组。这会自动呈现为下拉列表。

http://djangosnippets.org/snippets/494/

答案 3 :(得分:8)

Django国家

from django_countries.countries import COUNTRIES

class CountryForm(forms.Form):
      country= forms.ChoiceField(COUNTRIES)

答案 4 :(得分:4)

答案 5 :(得分:3)

这是一个很好的图书馆,有国家(不仅仅是):pycountry

它的主要优点是它是Debian软件包pkg-isocodes的包装器(因此可以自动更新)与其他解决方案中的硬编码国家相比。它也有翻译。

因此,如果出现新国家/地区或现有国家/地区将合并在一起,则无需更改代码。

我发现使用这个库并使用模型Country创建一个简单的Django应用程序非常有用,例如

然后,您可以通过自定义django-admin命令填充并保持最新的“国家/地区”表格,如下所述:Writing custom django-admin commands

答案 6 :(得分:3)

如先前的答案所述,CountryField中有django-countries。这是一个模型领域。

如果需要以普通形式(非模型形式)表单字段,则在django-countries v3.x(在3.3中明确测试)中可以使用以下内容:

from django_countries.data import COUNTRIES

class MyForm(forms.Form):
    country = forms.ChoiceField(sorted(COUNTRIES.items()))

答案 7 :(得分:1)

将它们放在数据库中是一种更好的方法。方便管理。

答案 8 :(得分:1)

链接到软件包:django-countries
如果要查找表格中的方法:

$ pip install django-countries

>>> from django_countries.data import COUNTRIES

>>> Country = forms.ChoiceField(choices = sorted(COUNTRIES.items()))

答案 9 :(得分:1)

Django使用pytz(例如参见django.utils.timezone),而pytz根据ISO 3166(see pytz docs)公开了country_names字典。

pytz.country_names词典可用于设置model field choicesform field choices

这可能无法涵盖所有​​极端情况,但至少,它不会给Django项目增加另一个晦涩的外部依赖项。

模型字段的示例(首先为import pytz

country = models.CharField(max_length=2, choices=pytz.country_names.items())

请注意,字典键(国家/地区代码)全为大写字母。

在更新pytz时要记住的另一件事:如Django Model field reference

中所述

每次choices的顺序更改时,都会创建一个新的迁移。

答案 10 :(得分:0)

以下是解决方案:

from django_countries.fields import CountryField

class Foo(TimeStampedModel):

    country = CountryField()

答案 11 :(得分:0)

我使用multiple=True解决了这个问题:

from django_countries.fields import CountryField    

class UserProfile(models.Model):
    countries = CountryField(multiple=True)

您可以在文档中了解更多信息:

https://github.com/SmileyChris/django-countries

答案 12 :(得分:0)

SmileyChris似乎非常忙碌且不可用,因为自9月以来未对存储库进行过更新。值得庆幸的是,有一个可以与Django 3和更高版本兼容的存储库。可以在这里找到:

https://github.com/yunojuno/django-countries/tree/django-30

它通过了对拉取请求的所有检查,但是SmileyChris尚未响应合并请求。

要安装它,只需运行pip install git+https://github.com/yunojuno/django-countries.git

答案 13 :(得分:0)

如果要扩展form.Form类,则必须在Countryfield之后指定.formfield,然后在formfield()参数中指定属性。

from django_countries.fields import CountryField
class CheckOutForm(forms.Form):
    country = CountryField().formfield()

但是,如果您要从models.Model类扩展,那么定义Coutryfield就足够了。

from django_countries.fields import CountryField
    class CheckOutForm(models.Model):
        country = CountryField()