You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在django_countries中配置COUNTRIES_ONLY限制表单国家选项?

解决Django中django-countries仅显示指定国家选项的问题

针对你的需求,有两种常用实现方式,分别适配不同场景:

一、全局配置(项目所有CountryField均生效)

将指定国家列表配置在项目的settings.py中,项目内所有使用CountryField的字段都会默认只显示这些选项:

  1. 打开项目根目录下的settings.py,添加以下配置:
COUNTRIES_ONLY = [
    "GB",
    "GG",
    "IM",
    "JE",
]
  1. 确保django_countries已在INSTALLED_APPS中(未添加则补充):
INSTALLED_APPS = [
    # 其他已注册应用
    'django_countries',
]

修改完成后重启Django服务,你的UserProfile模型中default_country字段就会自动仅展示指定的四个国家选项。

二、表单级配置(仅当前用户资料表单生效)

如果仅需要限制用户资料表单的国家选项,不影响项目内其他CountryField的显示,优先选择这种方式:

  1. 在应用目录下创建/编辑forms.py,编写自定义表单类:
from django import forms
from django_countries.widgets import CountrySelectWidget
from .models import UserProfile

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('default_full_name', 'default_email', 'default_phone_number', 
                  'default_street_address1', 'default_street_address2', 
                  'default_town_or_city', 'default_county', 'default_postcode', 
                  'default_country')
        widgets = {
            'default_country': CountrySelectWidget(
                countries=[
                    "GB",
                    "GG",
                    "IM",
                    "JE",
                ]
            ),
        }
  1. 在视图中应用该表单(以用户资料编辑视图为例):
from django.shortcuts import render, get_object_or_404
from .forms import UserProfileForm
from .models import UserProfile

def profile_edit(request):
    profile = get_object_or_404(UserProfile, user=request.user)
    if request.method == 'POST':
        form = UserProfileForm(request.POST, instance=profile)
        if form.is_valid():
            form.save()
            # 可添加保存成功的提示逻辑
    else:
        form = UserProfileForm(instance=profile)
    
    context = {'form': form}
    return render(request, 'profile/edit.html', context)
  1. 在模板中正常渲染表单即可,default_country字段会自动仅展示指定国家:
<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">保存资料</button>
</form>

两种方式对比:全局配置操作简单,适合项目统一需求;表单级配置灵活性更高,能针对单个表单做定制化处理,可根据你的实际场景选择。

内容的提问来源于stack exchange,提问作者Daithí

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:43:14