如何使用国家名称作为默认值而不是 django-countries 包中的代码

how to use country name as default instead of code in django-countries package

我正在使用一个名为 django-countries 的 django 包,它使我可以访问世界上某些国家/地区的属性,例如作为国家名称、国家代码、国旗等等。

似乎默认是国家代码,我想知道如何使用国家名称而不是默认国家代码。

models.py

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

class Product(models.Model):
    name = models.CharField(max_length=36)
    price = models.PositiveIntegerField()
    country = CountryField(blank_label='(select country)')

例如在我看来,我有这样的代码

def analyse_market(request):
    qs = Product.objects.values('country').annotate(
        number=Count('pk')
    ).order_by('country')

    result = {
        q['country']: q['number']
        for q in qs
    }

    print(result)

    context = {"result":result}
    return render(request, 'core/analyse-market.html', context)

这 return 结果是这样的:

{'AD': 3, 'AR': 5, 'BH': 1, 'FR': 1, 'JP': 1, 'NG': 1, 'NL': 1}

在文档中,他们使用了不同的方法,例如country.name、country.code、country.flag,我试过country.name,因为它与我需要的有关,但是在我的视图中使用 country.name 时出现 KeyError。

来自 django-countries 的 CountryField 只是一个有选择的 CharField。当在字段上使用 values 时,只需获取存储在数据库中的实际值。你需要自己把它变成你想要的。

要在 views 中执行此操作:

from django_countries import countries

COUNTRY_DICT = dict(countries)

def analyse_market(request):
    qs = Product.objects.values('country').annotate(
        number=Count('pk')
    ).order_by('country')

    result = {
        COUNTRY_DICT[q['country']]: q['number']
        for q in qs
    }

    print(result)

    context = {"result":result}
    return render(request, 'core/analyse-market.html', context)

要在 template 中执行此操作:

{% load countries %}

{% for country_code, number in result.items %}
    {% get_country country_code as country %}
    Country Name: {{ country.name }}
    Number: {{ number }}
{% endfor %}

编辑:如果您想直接从视图中传递 Country 对象,您可以执行以下操作:

from django_countries.fields import Country

result = {
    Country(code=q['country']): q['number']
    for q in qs
}

Note: Perhaps a list of tuples would be better for this instead? i.e.

result = [ (Country(code=q['country']), q['number']) for q in qs]