微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 django-countries 包中使用国家/地区名称作为默认名称而不是代码

如何解决如何在 django-countries 包中使用国家/地区名称作为默认名称而不是代码

我正在使用一个名为 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)

这会返回如下结果:

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

在文档中,他们使用了不同的方法,例如country.name、country.code、country.flag,我尝试了country.name,因为它与我需要的有关,但是在使用country 时出现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
}

注意:也许元组列表会更好?即

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。