A Django application that provides country choices for use with forms, flag icons static files, and a country field for models.

Overview

Django Countries

PyPI version Build status Coverage status

A Django application that provides country choices for use with forms, flag icons static files, and a country field for models.

Installation

  1. pip install django-countries
  2. Add django_countries to INSTALLED_APPS

For more accurate sorting of translated country names, install the optional pyuca package.

CountryField

A country field for Django models that provides all ISO 3166-1 countries as choices.

CountryField is based on Django's CharField, providing choices corresponding to the official ISO 3166-1 list of countries (with a default max_length of 2).

Consider the following model using a CountryField:

from django.db import models
from django_countries.fields import CountryField

class Person(models.Model):
    name = models.CharField(max_length=100)
    country = CountryField()

Any Person instance will have a country attribute that you can use to get details of the person's country:

>>> person = Person(name='Chris', country='NZ')
>>> person.country
Country(code='NZ')
>>> person.country.name
'New Zealand'
>>> person.country.flag
'/static/flags/nz.gif'

This object (person.country in the example) is a Country instance, which is described below.

Use blank_label to set the label for the initial blank choice shown in forms:

country = CountryField(blank_label='(select country)')

Multi-choice

This field can also allow multiple selections of countries (saved as a comma separated string). The field will always output a list of countries in this mode. For example:

class Incident(models.Model):
    title = models.CharField(max_length=100)
    countries = CountryField(multiple=True)

>>> for country in Incident.objects.get(title='Pavlova dispute').countries:
...     print(country.name)
Australia
New Zealand

The Country object

An object used to represent a country, instantiated with a two character country code, three character code, or numeric code.

It can be compared to other objects as if it was a string containing the country code and when evaluated as text, returns the country code.

name
Contains the full country name.
flag
Contains a URL to the flag. If you page could have lots of different flags then consider using flag_css instead to avoid excessive HTTP requests.
flag_css

Output the css classes needed to display an HTML element as the correct flag from within a single sprite image that contains all flags. For example:

<link rel="stylesheet" href="{% static 'flags/sprite.css' %}">
<i class="{{ country.flag_css }}"></i>

For multiple flag resolutions, use sprite-hq.css instead and add the flag2x, flag3x, or flag4x class. For example:

<link rel="stylesheet" href="{% static 'flags/sprite-hq.css' %}">
Normal: <i class="{{ country.flag_css }}"></i>
Bigger: <i class="flag2x {{ country.flag_css }}"></i>

You might also want to consider using aria-label for better accessibility:

<i class="{{ country.flag_css }}"
    aria-label="{% blocktrans with country_code=country.code %}
        {{ country_code }} flag
    {% endblocktrans %}"></i>
unicode_flag
A unicode glyph for the flag for this country. Currently well-supported in iOS and OS X. See https://en.wikipedia.org/wiki/Regional_Indicator_Symbol for details.
code
The two letter country code for this country.
alpha3
The three letter country code for this country.
numeric
The numeric country code for this country (as an integer).
numeric_padded
The numeric country code as a three character 0-padded string.
ioc_code
The three letter International Olympic Committee country code.

CountrySelectWidget

A widget is included that can show the flag image after the select box (updated with JavaScript when the selection changes).

When you create your form, you can use this custom widget like normal:

from django_countries.widgets import CountrySelectWidget

class PersonForm(forms.ModelForm):
    class Meta:
        model = models.Person
        fields = ('name', 'country')
        widgets = {'country': CountrySelectWidget()}

Pass a layout text argument to the widget to change the positioning of the flag and widget. The default layout is:

'{widget}<img class="country-select-flag" id="{flag_id}" style="margin: 6px 4px 0" src="{country.flag}">'

Custom forms

If you want to use the countries in a custom form, use the model field's custom form field to ensure the translatable strings for the country choices are left lazy until the widget renders:

from django_countries.fields import CountryField

class CustomForm(forms.Form):
    country = CountryField().formfield()

Use CountryField(blank=True) for non-required form fields, and CountryField(blank_label='(Select country)') to use a custom label for the initial blank option.

You can also use the CountrySelectWidget as the widget for this field if you want the flag image after the select box.

Get the countries from Python

Use the django_countries.countries object instance as an iterator of ISO 3166-1 country codes and names (sorted by name).

For example:

>>> from django_countries import countries
>>> dict(countries)['NZ']
'New Zealand'

>>> for code, name in list(countries)[:3]:
...     print(f"{name} ({code})")
...
Afghanistan (AF)
Åland Islands (AX)
Albania (AL)

Country names are translated using Django's standard gettext. If you would like to help by adding a translation, please visit https://www.transifex.com/projects/p/django-countries/

Template Tags

If you have your country code stored in a different place than a CountryField you can use the template tag to get a Country object and have access to all of its properties:

{% load countries %}
{% get_country 'BR' as country %}
{{ country.name }}

If you need a list of countries, there's also a simple tag for that:

{% load countries %}
{% get_countries as countries %}
<select>
{% for country in countries %}
    <option value="{{ country.code }}">{{ country.name }}</option>
{% endfor %}
</select>

Customization

Customize the country list

Country names are taken from the official ISO 3166-1 list. If your project requires the use of alternative names, the inclusion or exclusion of specific countries then use the COUNTRIES_OVERRIDE setting.

A dictionary of names to override the defaults. The values can also use a more complex dictionary format.

Note that you will need to handle translation of customised country names.

Setting a country's name to None will exclude it from the country list. For example:

from django.utils.translation import gettext_lazy as _

COUNTRIES_OVERRIDE = {
    'NZ': _('Middle Earth'),
    'AU': None,
    'US': {'names': [
        _('United States of America'),
        _('America'),
    ],
}

If you have a specific list of countries that should be used, use COUNTRIES_ONLY:

COUNTRIES_ONLY = ['NZ', 'AU']

or to specify your own country names, use a dictionary or two-tuple list (string items will use the standard country name):

COUNTRIES_ONLY = [
    'US',
    'GB',
    ('NZ', _('Middle Earth')),
    ('AU', _('Desert')),
]

Show certain countries first

Provide a list of country codes as the COUNTRIES_FIRST setting and they will be shown first in the countries list (in the order specified) before all the alphanumerically sorted countries.

If you want to sort these initial countries too, set the COUNTRIES_FIRST_SORT setting to True.

By default, these initial countries are not repeated again in the alphanumerically sorted list. If you would like them to be repeated, set the COUNTRIES_FIRST_REPEAT setting to True.

Finally, you can optionally separate these 'first' countries with an empty choice by providing the choice label as the COUNTRIES_FIRST_BREAK setting.

Customize the flag URL

The COUNTRIES_FLAG_URL setting can be used to set the url for the flag image assets. It defaults to:

COUNTRIES_FLAG_URL = 'flags/{code}.gif'

The URL can be relative to the STATIC_URL setting, or an absolute URL.

The location is parsed using Python's string formatting and is passed the following arguments:

  • code
  • code_upper

For example: COUNTRIES_FLAG_URL = 'flags/16x10/{code_upper}.png'

No checking is done to ensure that a static flag actually exists.

Alternatively, you can specify a different URL on a specific CountryField:

class Person(models.Model):
    name = models.CharField(max_length=100)
    country = CountryField(
        countries_flag_url='//flags.example.com/{code}.png')

Single field customization

To customize an individual field, rather than rely on project level settings, create a Countries subclass which overrides settings.

To override a setting, give the class an attribute matching the lowercased setting without the COUNTRIES_ prefix.

Then just reference this class in a field. For example, this CountryField uses a custom country list that only includes the G8 countries:

from django_countries import Countries

class G8Countries(Countries):
    only = [
        'CA', 'FR', 'DE', 'IT', 'JP', 'RU', 'GB',
        ('EU', _('European Union'))
    ]

class Vote(models.Model):
    country = CountryField(countries=G8Countries)
    approve = models.BooleanField()

Complex dictionary format

For COUNTRIES_ONLY and COUNTRIES_OVERRIDE, you can also provide a dictionary rather than just a translatable string for the country name.

The options within the dictionary are:

name or names (required)
Either a single translatable name for this country or a list of multiple translatable names. If using multiple names, the first name takes preference when using COUNTRIES_FIRST or the Country.name.
alpha3 (optional)
An ISO 3166-1 three character code (or an empty string to nullify an existing code for this country.
numeric (optional)
An ISO 3166-1 numeric country code (or None to nullify an existing code for this country. The numeric codes 900 to 999 are left available by the standard for user-assignment.
ioc_code (optional)
The country's International Olympic Committee code (or an empty string to nullify an existing code).

Country object external plugins

Other Python packages can add attributes to the Country object by using entry points in their setup script.

For example, you could create a django_countries_phone package which had a with the following entry point in the setup.py file. The entry point name (phone) will be the new attribute name on the Country object. The attribute value will be the return value of the get_phone function (called with the Country instance as the sole argument).

setup(
    ...
    entry_points={
        'django_countries.Country': 'phone = django_countries_phone.get_phone'
    },
    ...
)

Django Rest Framework

Django Countries ships with a CountryFieldMixin to make the CountryField model field compatible with DRF serializers. Use the following mixin with your model serializer:

from django_countries.serializers import CountryFieldMixin

class CountrySerializer(CountryFieldMixin, serializers.ModelSerializer):

    class Meta:
        model = models.Person
        fields = ('name', 'email', 'country')

This mixin handles both standard and multi-choice country fields.

Django Rest Framework field

For lower level use (or when not dealing with model fields), you can use the included CountryField serializer field. For example:

from django_countries.serializer_fields import CountryField

class CountrySerializer(serializers.Serializer):
    country = CountryField()

You can optionally instantiate the field with the countries argument to specify a custom Countries instance.

REST output format

By default, the field will output just the country code. To output the full country name instead, instanciate the field with name_only=True.

If you would rather have more verbose output, instantiate the field with country_dict=True, which will result in the field having the following output structure:

{"code": "NZ", "name": "New Zealand"}

Either the code or this dict output structure are acceptable as input irregardless of the country_dict argument's value.

OPTIONS request

When you request OPTIONS against a resource (using the DRF metadata support) the countries will be returned in the response as choices:

OPTIONS /api/address/ HTTP/1.1

HTTP/1.1 200 OK
Content-Type: application/json
Allow: GET, POST, HEAD, OPTIONS

{
"actions": {
  "POST": {
    "country": {
    "type": "choice",
    "label": "Country",
    "choices": [
      {
        "display_name": "Australia",
        "value": "AU"
      },
      [...]
      {
        "display_name": "United Kingdom",
        "value": "GB"
      }
    ]
  }
}

GraphQL

A Country graphene object type is included that can be used when generating your schema.

import graphene
from graphene_django.types import DjangoObjectType
from django_countries.graphql.types import Country

class Person(ObjectType):
    country = graphene.Field(Country)

    class Meta:
        model = models.Person
        fields = ["name", "country"]

The object type has the following fields available:

  • name for the full country name
  • code for the ISO 3166-1 two character country code
  • alpha3 for the ISO 3166-1 three character country code
  • numeric for the ISO 3166-1 numeric country code
  • iocCode for the International Olympic Committee country code
Issues
  • Field is not serializeable with Django Rest Framework

    Field is not serializeable with Django Rest Framework

    Hello,

    I have encountered an issues when working with the country field and Django Rest Framwork. If in the models we have a field that can be set to blank:

    country = CountryField(_('country'), blank=True, null=True, default='NL')
    

    when used as a normal field in the serializer I get an error that: TypeError: Country(code=u'') is not JSON serializable. This happens only when the country field is blank.

    It has been reported by someone else also on the django rest framework group. https://groups.google.com/forum/#!topic/django-rest-framework/3hrS2xr6BS0

    I am not sure exactly if this can be solved on the django rest framework side but thought to report it here also. It might be solved on the django-countries side.

    Thanks, Vlad

    opened by vladlep 30
  • Deprecate Python 2 and Django 1.x, add Django 3.0, DRF 3.10/11 support

    Deprecate Python 2 and Django 1.x, add Django 3.0, DRF 3.10/11 support

    Overlaps with #279 , #285, #286, #287, #290 in preparing for Django 3 and deprecating Python 2.


    This is intended as a prototype to demonstrate what django-countries would look like if it dropped support for Python 2 and Django 1.x when moving to Django 3 support (I totally understand @SmileyChris' desire to continue to support legacy versions, and am happy for the PR to be closed without merging) - its main purpose is discussion / reference.

    One thing that worth pointing out is the Django <> DRF test matrix. In version 3.7/8/9 DRF relies on the Django vendored version of six which was dropped in Django 3.0. Hence specifying DRF 3.10/11 for the Django 3.0 tests.

    | Python | Django 2.2 | Django 3.0 | |---|:--|:--| | 3.5 | DRF: 3.7, 3.8 | n/a | | 3.6 | DRF: 3.7, 3.8, 3.9 | 3.10, 3.11 | | 3.7 | DRF: 3.7, 3.8, 3.9 | 3.10, 3.11 | | 3.8 | DRF: 3.7, 3.8, 3.9 | 3.10, 3.11 |

    Changes

    • Remove use of six across the project
    • Replace force_text with force_str
    • Remove conditional Py2/3 import statements in favour of Py3 only
    • Replace mock with unittest.mock
    • Update super(Klass, self) to super() syntax
    • Remove __future__.unicode_literals imports
    • Update tox test configuration
    • Update travis CI configuration
    • Update classifiers in setup.cfg
    • Replace ugettext with gettext (deprecated in Django 4.0, and already just an alias)
    opened by hugorodgerbrown 10
  • Add support for the upcoming Django 3.2

    Add support for the upcoming Django 3.2

    The CountryField uses super() in a few methods to skip CharField's methods and call methods of the CharField's superclass directly. Django 3.2 adds support for db_collation to CharField, but the CountryField doesn't need this. Since CountryField.__init__ does not call CharField.__init__, CountryField.deconstruct shouldn't call CharField.deconstruct either.

    Also, Django 3.1 and django-rest-framework 3.10.x are not compatible because django-rest-framework imports the FieldDoesNotExist exception from location where it isn't available anymore in Django 3.1. Therefore, this pull request also removes this combination from the CI matrix.

    Replaces #328

    opened by matthiask 10
  • Capitalization and diacritics in some country names

    Capitalization and diacritics in some country names

    While comparing the names of countries in the lists with those from iso-codes (http://packages.debian.org/iso-codes) I found some minor differences that should be fixed.

    The attached patch fixes all differences that I could find and for the record, those were my references:

    • http://www.nationsonline.org/oneworld/cote_d_ivoire.htm
    • http://www.nationsonline.org/oneworld/guinea_bissau.htm
    • http://www.vlada.mk/?language=en-gb
    • http://www.nationsonline.org/oneworld/reunion.htm
    • http://www.tristandc.com/
    • http://www.nationsonline.org/oneworld/timor_leste.htm

    • Bitbucket: https://bitbucket.org/smileychris/django-countries/issue/16
    • Originally Reported By: FladischerMichael
    • Originally Created At: 2011-10-30 23:39:52
    opened by SmileyChris 10
  • With DRF and depth > 1, got

    With DRF and depth > 1, got "Object of type 'Country' is not JSON serializable"

    So, I have a model of Service and Participant (this one has country), and the Service contains Participant.

    I'm using on my serializer:

    class ParticipantSerializer(serializers.ModelSerializer, CountryFieldMixin):
    
        class Meta:
            model = Participant
            fields = ('__all__')
    
    
    class ServiceSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = Service
            fields = ('__all__')
            depth = 1
    

    When I do a GET to /service:

    TypeError at /api/v1/service/
    Object of type 'Country' is not JSON serializable
    

    I'm using: Python 3.6 Django 2.0.8 djangorestframework 3.8.2 django-countries 5.3.2

    What am I missing?

    Thanks!

    opened by felipewove 9
  • Required Attribute Missing from CountrySelectWidget for Required CountryFields when COUNTRIES_FIRST_BREAK Setting Turned On

    Required Attribute Missing from CountrySelectWidget for Required CountryFields when COUNTRIES_FIRST_BREAK Setting Turned On

    When blank=True is not set on the CountryField of a model, the corresponding CountrySelectWidget in the ModelForm should render the select element with a required attribute.

    Python version: 3.5.2 Django version: 1.11.4

    opened by verngutz 9
  • Better sorting

    Better sorting

    I added unicode-aware sorting. For example, Latvia is translated in Polish to Łotwa. Diacritic Ł letter in Polish alphabet appears after L letter, but default python sorted function is ASCII only, so Łotwa will be added at the end of list (after all countries starting at Z). It does not require additional setup, but python locale.setlocale function is platform dependent. E. g. if you have set LANGUAGE_CODE = "en_us" and you are running Linux you need to use Linux language format, LANGUAGE_CODE = en_us.UTF-8. Django works fine with this format. Alternatively, if you don't like that sorting require adjusting LANGUAGE_CODE it can be added to django_countries specific settings.

    opened by fenuks 9
  • Add flag image to immediately after country select.

    Add flag image to immediately after country select.

    This flag will automatically update when the selection is changed.

    Note: there is also an empty __.gif flag that will show when no selection.

    opened by schinckel 8
  • Add ability to query by country name

    Add ability to query by country name

    It would be nice to be able to do this so I don't need to add yet another package to get that functionality. Is there any interest in a pull request with this functionality?

    opened by jschneier 8
  • Renamed zh_CN to zh_Hans

    Renamed zh_CN to zh_Hans

    See: https://docs.djangoproject.com/en/1.9/internals/deprecation/#deprecation-removed-in-1-9

    opened by dongcarl 8
  • Different country choices for different model fields

    Different country choices for different model fields

    For a website I need to limit the country choices on a per-field basis. The usual way of using the COUNTRIES_ONLY setting does not work here.

    Example: A phone provider that has customers in the US and Canada, and allows calls to US, Canada and also the UK wants to log all calls:

    class Call(models.Model):
        customer = models.ForeignKey(Customer)
        calling_from = CountryField(choices=[
            ("US", _("United States of America")), ("CA", _("Canada"))]
        calling_to = CountryField(choices=[
            ("US", _("United States of America")), ("CA", _("Canada")),
            ("UK", _("United Kingdom and Northern Ireland"))]
    

    Unfortunately this also doesn't work, because the choices kwarg is always overwritten with the full list of countries.

    Do you think that only setting the choices kwarg when it is unset would be ok or is there some other code that depends on it?

    opened by soult 8
  • Macedonia COMMON_NAME not translated in ja

    Macedonia COMMON_NAME not translated in ja

    The ja locale of django.po is missing Macedonia, which is listed in the COMMON_NAME in data.py. Supposed to be at line 36 but it skipped to Russia.

    opened by almond55 7
  • Can't save CountryField with None value

    Can't save CountryField with None value

    I have a model with a CountryField that has allowed null values. However, when creating a new instance of that model, an empty string is saved into database instead, causing unique constraints to fail. It seems that problem is in get_prep_value method, because it receives a Country object with code attribute set to None instead of primitive None value.

    Example model:

    class Failing(models.Model):
        country = CountryField(null=True, unique=True)
        count = models.PositiveIntegerField(default=0)
    

    Failing code:

    a, created1 = Failing.objects.get_or_create(country=None)
    b, created2 = Failing.objects.get_or_create(country=None)
    
    assert a == b
    assert created1 is True
    assert created2 is False
    
    opened by sairon 7
  • Extremely slow admin when displaying country in list_display

    Extremely slow admin when displaying country in list_display

    Using country as a list_display field in the admin is 10x slower than not. My example admin below shows the issue with the slow time -- the admin is only showing 10 objs per page. Using a custom display_name to show the 2 character country code instead fixes the issue.

    This is with debug True, but the same problem exists when debug is False. No sure where to start to fix this issue.

    @admin.register(Retailer)
    class RetailerAdmin(admin.ModelAdmin):
        list_display = (
            'id',
            'is_active',
            'company_name',
            'country',
        )
        
        def display_country(self, obj):
            return str(obj.country)
    

    Using display_country instead of country: No Country

    Using country: With Country

    opened by maestrofjp 7
  • Option to Suppress Flag from CountrySelectWidget

    Option to Suppress Flag from CountrySelectWidget

    Hello. I want your list of countries in a select field in my Django form, but I do not want the tag with the flag in it. Can you add a boolean to suppress that rendered tag? Right now, I am doing that with Javascript.

    opened by mmangione 7
  • Country restriction

    Country restriction

    If I only want to display a couple of countries to start, it looks like I have to go through the list of all countries and set all but say, Canada and USA, to None. Is this correct? It seems like there should be the opposite way to do this, and only list of the countries you want included.

    opened by akajb84 7
  • Slow admin loading

    Slow admin loading

    I have a field of type CountryField. In the admin interface, when I use this field in the list display, it's incredibly slow to load when there are ~100 rows.

    I've tried using list_select_related = ('country',), or even list_select_related = True, but there is no speedup (DDT doesn't report any extra queries with or without this - 5 in each case). However, there is significant speed increase when I use a filter (reducing the number of rows) or if I remove this field from the list display interface.

    Is there any way to speed this up/cache the results?

    opened by luke3141 7
  • Allow using unicode flag symbols.

    Allow using unicode flag symbols.

    Here's something cool I worked on today. Now platforms have mostly full support for unicode flags, we can have them generated here, which means rendering will not require fetching an image.

    (This is even nicer when you use it as a data-attribute on a select option, and have it update the display when the selection changes).

    opened by schinckel 6
  • Farsi Translation

    Farsi Translation

    Please find below, thanks!

    opened by bee-keeper 6
  • Updates CountryField for django 3.2 compatibility.

    Updates CountryField for django 3.2 compatibility.

    Django 3.2 updates the underlying CharField to include new logic for db_collation. This change set fixes the CountryField so that it is compatible with the new constructor format.

    opened by robcharlwood 6
  • Fix for CountryField multiple=true option and Django Admin View

    Fix for CountryField multiple=true option and Django Admin View

    An error occurred when a Countries field with the optional multiple=True field was used within DjangoAdmin.

    The admin screen would fail to render the view, citing that the Country object was not iterable. It seems that there were problems with blank values being returned.

    This commit adds checks to make sure that values which are set to None are handled properly.

    opened by chris-jones 6
  • Adds Kosovo

    Adds Kosovo

    opened by richardARPANET 6
  • force_text() deprecated with Django 3

    force_text() deprecated with Django 3

    Hello,

    force_text() has been deprecated in Django 3.

    Thus we have warning using django-countries with Django 3:

    lib/python3.6/site-packages/django_countries/__init__.py:252: RemovedInDjango40Warning: force_text() is deprecated in favor of force_str().
        code = force_text(code).upper()
    

    Could we make the switch to force_str()?

    I could provide a PR if necessary :)

    opened by MonsieurV 6
  • CountryField: Prevent problem where reconstructing a field with South le...

    CountryField: Prevent problem where reconstructing a field with South le...

    ...ads to max_length being passed twice

    I installed django-countries==2.0b2 in an internal project of mine, changed the CountryField import and ran ./manage.py schemamigration contacts --auto to see whether anything changed. The field reconstruction failed with a TypeError because South also put the max_length into the serialized model representation.

    Instead of reverting a part of 5c9a6cf7409ada28fc00dc0fe0f41a21553d426c I choose to follow your implementation change, where max_length and choices are set unconditionally to their values.

    opened by matthiask 6
  • Add form field

    Add form field

    Would be super to have a form field to select a country


    • Bitbucket: https://bitbucket.org/smileychris/django-countries/issue/7
    • Originally Reported By: Evgeny Fadeev
    • Originally Created At: 2011-02-10 06:54:10
    opened by SmileyChris 5
  • Translating countries in Django model

    Translating countries in Django model

    First off, thanks for the great work on this lib. It's a fantastic time-saver, and a really well-done one.

    My issue is a bit of a noob's one. I have a model that must be of a certain type (i.e. it cannot be a LazyTypedChoiceField). It will be rendered as a form element in my application. I'm unpacking django_countries.fields to seed its choices (snippet below).

    from django.utils.translation import ugettext_lazy as _
    
    country_select = models.CharField(
        verbose_name=_(u'In which country were you born?'),
        widget=widgets.Select(),
        choices=tuple((code, _(name)) for code, name in list(countries))  # notice the call to `_()` on name
    )
    

    It works fine, except for the localization. Calling ugettext_lazy within the comprehension doesn't work. The list of countries in my widget seemingly never get localized and remain in English.

    I'm not sure how to proceed... I hate to be that guy (y'know, that one guy who fills an issue on Github when it might have nothing to do with you lib, and more with my ignorance of Python), but hey... I figured you could point me to the right direction. 😅

    Thanks in advance!

    opened by dheavy 5
  • Taiwan official name is “Republic of China”

    Taiwan official name is “Republic of China”

    According to Wikipedia, the official name of Taiwan is “Republic of China”.

    I fixed it on my fork, but it might have broken some translation.


    • Bitbucket: https://bitbucket.org/smileychris/django-countries/issue/29
    • Originally Reported By: Antoine Catton
    • Originally Created At: 2013-03-29 18:11:32
    opened by SmileyChris 5
  • Added new Spanish Translation

    Added new Spanish Translation

    https://www.transifex.net/projects/p/django-countries/resource/djangopo/


    • Bitbucket: https://bitbucket.org/smileychris/django-countries/issue/13
    • Originally Reported By: Juan Miguel Calcaño
    • Originally Created At: 2011-09-16 09:24:10
    opened by SmileyChris 5
  • TypeError: 'type' object is not subscriptable

    TypeError: 'type' object is not subscriptable

    I get an error with the newest django-countries version 7.3 in my python 3.8 environment:

    Traceback (most recent call last):
      File "/usr/lib/python3.8/runpy.py", line 194, in _run_module_as_main
        return _run_code(code, main_globals, None,
      File "/usr/lib/python3.8/runpy.py", line 87, in _run_code
        exec(code, run_globals)
      File "/var/pretix/venv/lib/python3.8/site-packages/pretix/__main__.py", line 30, in <module>
        execute_from_command_line(sys.argv)
      File "/var/pretix/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
        utility.execute()
      File "/var/pretix/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
        django.setup()
      File "/var/pretix/venv/lib/python3.8/site-packages/django/__init__.py", line 24, in setup
        apps.populate(settings.INSTALLED_APPS)
      File "/var/pretix/venv/lib/python3.8/site-packages/django/apps/registry.py", line 91, in populate
        app_config = AppConfig.create(entry)
      File "/var/pretix/venv/lib/python3.8/site-packages/django/apps/config.py", line 224, in create
        import_module(entry)
      File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
      File "<frozen importlib._bootstrap>", line 991, in _find_and_load
      File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 848, in exec_module
      File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
      File "/var/pretix/venv/lib/python3.8/site-packages/django_countries/__init__.py", line 66, in <module>
        class Countries(CountriesBase):
      File "/var/pretix/venv/lib/python3.8/site-packages/django_countries/__init__.py", line 380, in Countries
        ) -> set[str]:
    TypeError: 'type' object is not subscriptable
    
    opened by bruecksen 2
  • typing.Literal import error

    typing.Literal import error

    typing.Literal may be used in python 3.8 and higher, it doesn't work in python3.6. To fix it need to import Literal from typing_extension (https://stackoverflow.com/a/67193166/3110300, https://github.com/python/typing/tree/master/typing_extensions) In my free time I can prepare a PR with fix if need.

    opened by arthur-s 1
  • fix: use typing.Set for python <3.9 compatibility

    fix: use typing.Set for python <3.9 compatibility

    the use of set[str] is not supported in python < 3.9

    The tests also catch that, so maybe there is an issue with the CI setup?

    opened by RaphaelKimmig 0
  • Include demonyms

    Include demonyms

    It would be nice if the Country object could provide demonyms such as "Polish" or "Ghanan".

    Quick google search turned up a few data sets of uncertain quality, and including it in the application could be non-trivial.

    Besides that, translation could also be a significant effort.

    opened by voidus 0
  • Common names are not always honored for non-english translations

    Common names are not always honored for non-english translations

    When we are translating a country name into a non-English language, the shorter name from COMMON_NAMES is not always honored:

    >>> from django.utils import translation
    >>> from django_countries import countries
    >>> countries.name('VE')
    'Venezuela'
    >>> translation.activate('de')
    >>> countries.name('VE')
    'Venezuela (Bolivarische Republik)'   # Expected value: "Venezuela"
    

    This seems to be caused by commit https://github.com/SmileyChris/django-countries/commit/eee10e68fac207867ce08b74ba1700ad2d1ca6ff

    Note that this only happens, because the German translation of the English common name "Venezuela" is also "Venezuela", so the condition in https://github.com/SmileyChris/django-countries/blob/62ed634f2e96ea734416c07f4034f4f37b13e706/django_countries/init.py#L246 holds true, and we start to compare fallback names.

    For cases where the German translation of the English common name is different, e.g. "Russland" vs "Russia", translation of the name works just fine, because the condition in line 246 doesn't hold true:

    >>> from django.utils import translation
    >>> from django_countries import countries
    >>> countries.name('RU')
    'Russia'
    >>> translation.activate('de')
    >>> countries.name('RU')
    'Russland' # With the bug, we would see "Russische Föderation" here
    

    I am not sure what the intention of the statement in line 246 is.

    Is it testing whether a translated version of the common name is available?

    If yes, it seems like testing the translated string for equality with the original string is not the correct approach for this.

    opened by cfra 0
  • Blank=True is not working?

    Blank=True is not working?

    My custom form field

    country = CountryField(blank_label="Select country", blank=True).formfield()

    image

    image

    opened by hungtienvu 0
  • How to serialize and get all countries from api

    How to serialize and get all countries from api

    Hello , i would like to ask how i could create a api view with an array that includes all available countries

    opened by vasilistotskas 1
  • Dynamically modify country select form field

    Dynamically modify country select form field

    Hi there!

    Is there any way to dynamically modify country select choices. My use case - if user have already selected a country I don't want to show this country anymore in the select options. The only way to customise country list I see in the documentation is:

    class G8Countries(Countries):
        only = ['CA', 'FR', 'DE', 'IT', 'JP', 'RU', 'GB']
    
    class VisitedCountryForm(ModelForm):
        country = CountryField(countries=G8Countries).formfield()
    

    but there is no way to make it dynamic.

    Any suggestion on how to proceed with this?

    opened by Slawikus 0
  • Wonder why there are two translations of

    Wonder why there are two translations of "Falkland Islands"?

    image

    As far as I understand, base.py has some old names of countries (Like "SZ" -> old: "Swaziland", new: "Eswatini") but for "FK", old name is "Falkland Islands [Malvinas]", and new name is "Falkland Islands (Malvinas)". I just wonder why.

    https://github.com/SmileyChris/django-countries/blob/62ed634f2e96ea734416c07f4034f4f37b13e706/django_countries/base.py#L32

    https://github.com/SmileyChris/django-countries/blob/62ed634f2e96ea734416c07f4034f4f37b13e706/django_countries/data.py#L104

    opened by sh-cho 0
  • Migrate CI to GitHub actions

    Migrate CI to GitHub actions

    From https://travis-ci.org/github/SmileyChris/django-countries

    image

    Travis CI is no longer working, this is an attempt at moving the CI to GitHub actions. I've attempted to change the minimum amount of things compared to the current setup.

    Due to GitHub security limitations, workflows added from forks won't run on a pull request (hence no status), but you can see the results here.

    opened by browniebroke 0
The best way to have DRY Django forms. The app provides a tag and filter that lets you quickly render forms in a div format while providing an enormous amount of capability to configure and control the rendered HTML.

django-crispy-forms The best way to have Django DRY forms. Build programmatic reusable layouts out of components, having full control of the rendered

null 4.4k Feb 26, 2022
django-quill-editor makes Quill.js easy to use on Django Forms and admin sites

django-quill-editor django-quill-editor makes Quill.js easy to use on Django Forms and admin sites No configuration required for static files! The ent

lhy 110 Feb 11, 2022
MAC address Model Field & Form Field for Django apps

django-macaddress MAC Address model and form fields for Django We use netaddr to parse and validate the MAC address. The tests aren't complete yet. Pa

null 46 Feb 17, 2022
A drop-in replacement for django's ImageField that provides a flexible, intuitive and easily-extensible interface for quickly creating new images from the one assigned to the field.

django-versatileimagefield A drop-in replacement for django's ImageField that provides a flexible, intuitive and easily-extensible interface for creat

Jonathan Ellenberger 480 Feb 23, 2022
Money fields for Django forms and models.

django-money A little Django app that uses py-moneyed to add support for Money fields in your models and forms. Django versions supported: 1.11, 2.1,

null 1.2k Mar 3, 2022
Django-Audiofield is a simple app that allows Audio files upload, management and conversion to different audio format (mp3, wav & ogg), which also makes it easy to play audio files into your Django application.

Django-Audiofield Description: Django Audio Management Tools Maintainer: Areski Contributors: list of contributors Django-Audiofield is a simple app t

Areski Belaid 162 Feb 25, 2022
Django-static-site - A simple content site framework that harnesses the power of Django without the hassle

coltrane A simple content site framework that harnesses the power of Django with

Adam Hill 30 Feb 19, 2022
Use webpack to generate your static bundles without django's staticfiles or opaque wrappers.

django-webpack-loader Use webpack to generate your static bundles without django's staticfiles or opaque wrappers. Django webpack loader consumes the

null 2.3k Feb 27, 2022
A set of high-level abstractions for Django forms

django-formtools Django's "formtools" is a set of high-level abstractions for Django forms. Currently for form previews and multi-step forms. This cod

Jazzband 568 Feb 23, 2022
Organize Django settings into multiple files and directories. Easily override and modify settings. Use wildcards and optional settings files.

Organize Django settings into multiple files and directories. Easily override and modify settings. Use wildcards in settings file paths and mark setti

Nikita Sobolev 823 Feb 23, 2022
django Filer is a file management application for django that makes handling of files and images a breeze.

django Filer is a file management application for django that makes handling of files and images a breeze.

django CMS Association 1.5k Mar 4, 2022
Location field and widget for Django. It supports Google Maps, OpenStreetMap and Mapbox

django-location-field Let users pick locations using a map widget and store its latitude and longitude. Stable version: django-location-field==2.1.0 D

Caio Ariede 466 Feb 6, 2022
A django model and form field for normalised phone numbers using python-phonenumbers

django-phonenumber-field A Django library which interfaces with python-phonenumbers to validate, pretty print and convert phone numbers. python-phonen

Stefan Foulis 1.2k Mar 2, 2022
A django model and form field for normalised phone numbers using python-phonenumbers

django-phonenumber-field A Django library which interfaces with python-phonenumbers to validate, pretty print and convert phone numbers. python-phonen

Stefan Foulis 1.2k Feb 24, 2022
django-reversion is an extension to the Django web framework that provides version control for model instances.

django-reversion django-reversion is an extension to the Django web framework that provides version control for model instances. Requirements Python 3

Dave Hall 2.7k Feb 23, 2022
A reusable Django model field for storing ad-hoc JSON data

jsonfield jsonfield is a reusable model field that allows you to store validated JSON, automatically handling serialization to and from the database.

Ryan P Kilby 1.1k Feb 10, 2022
Custom Django field for using enumerations of named constants

django-enumfield Provides an enumeration Django model field (using IntegerField) with reusable enums and transition validation. Installation Currently

5 Monkeys 186 Feb 6, 2022
A pickled object field for Django

django-picklefield About django-picklefield provides an implementation of a pickled object field. Such fields can contain any picklable objects. The i

Gintautas Miliauskas 157 Feb 20, 2022
A pickled object field for Django

django-picklefield About django-picklefield provides an implementation of a pickled object field. Such fields can contain any picklable objects. The i

Gintautas Miliauskas 157 Feb 20, 2022