我有一份地址信息表。其中一个字段是地址国家/地区。目前这只是一个文本框。我想要一个下拉列表(ISO 3166国家)。我是一个django新手,所以我还没有使用过Django Select小部件。有什么好办法呢?
在某个地方对文件中的选项进行硬编码?把它们放在数据库中?在模板中?
答案 0 :(得分:32)
查看CharField的“choices”参数。
您可能还想查看django-countries。
答案 1 :(得分:15)
from django_countries.fields import CountryField
class Foo(models.Model):
country = CountryField()
答案 2 :(得分:9)
使用下面的片段结束,该片段基本上定义了两个字符国家/地区代码的元组元组。此外,它定义了一个名为CountryField的自定义字段类型,并将choices参数默认为上面定义的元组。这会自动呈现为下拉列表。
答案 3 :(得分:8)
Django国家
from django_countries.countries import COUNTRIES
class CountryForm(forms.Form):
country= forms.ChoiceField(COUNTRIES)
答案 4 :(得分:4)
两个低矮的项目:
http://code.google.com/p/django-countries/
https://github.com/strange/django-country-utils
两个片段:
http://djangosnippets.org/snippets/494/
http://djangosnippets.org/snippets/1476/
现在,我想要一个片段。
答案 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 choices或form 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)
您可以在文档中了解更多信息:
答案 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()