Страны Django — невозможно предварительно выбрать нужную страну в форме редактирования

#python #django #django-models #django-forms #django-countries

#python #django #django-модели #django-forms #django-страны

Вопрос:

Рассмотрим эту модель:

 class Address(models.Model):
    line1 = models.CharField(max_length=255, db_index=True, blank=True, null=True)
    city = models.CharField(max_length=255, db_index=True, blank=True, null=True)
    state = models.CharField(max_length=255, db_index=True, blank=True, null=True)
    postcode = UppercaseCharField(max_length=64, blank=True, db_index=True, null=True)
    country = CountryField(db_index=True, blank=True, null=True)
 

Я пытаюсь заполнить эту модель, используя данные, поступающие через вызов webhook. У меня возникли проблемы с заполнением страны в двух случаях:

Когда страна «Соединенные Штаты» (это то, что возвращает веб-хук, я не могу это контролировать) — django_countries не распознает это, поэтому я добавил условие if для изменения «Соединенные Штаты» на USA перед созданием нового объекта Address, но, когда страна не является United States,например, «Панама», я заполняю ее непосредственно в модели, делая это:

 country = request.POST.get('country')    # returns something like "Panama"
Address.objects.create(line1=line1, city=city, state=state, country=country)
 

Это работает нормально, за исключением того, что когда я пытаюсь отредактировать форму адреса, поле страны остается пустым, в нем не выбирается «Панама» из параметров. Я знаю country , что поле этого экземпляра адреса является объектом country, потому что я могу сделать address_form.instance.country , и он выводит Pa , если я делаю address_form.instance.country.name это выводит Panama . Итак, почему поле страны в форме не выбирает нужную страну, почему оно отображается пустым?

Это моя типовая форма:

 class NewAddressForm(ModelForm):
    class Meta:
        model = Address
        fields = ['line1', 'city', 'state', 'postcode', 'country']

    def __init__(self, *args, **kwargs):
        super(NewAddressForm, self).__init__(*args, **kwargs)
 

Это мой шаблон [здесь отображается только поле страны]

  <div class="col-md-5">|

     {% comment %}
     COUNTRYCode: {{address_form.instance.country.code}} ---> Outputs Pa in case of Panama
     COUNTRYName: {{address_form.instance.country.name}} ---> Outputs Panama in case of Panama
     {% endcomment %}

     <div class="form-group">
         <label>{{address_form.country.label}}</label>
         {% render_field address_form.country class="form-control m-b" name="country" id="country_dropdown"%}
     </div>
 </div>
 

Ответ №1:

  1. Как насчет проблемы с Соединенными Штатами: я думаю, что лучшим вариантом для вас будет настроить названия стран, как описано здесь .
 from django.utils.translation import gettext_lazy as _

COUNTRIES_OVERRIDE = {
    'NZ': _('Middle Earth'),
    'AU': None,
    'US': {'names': [
        _('United States of America'),
        _('America'),
    ],
}
 
  1. Вы пробовали использовать CountrySelectWidget вот так? Если нет, не могли бы вы попытаться сказать, правильно ли это работает для вас?
 from django_countries.widgets import CountrySelectWidget

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

Комментарии:

1. Я попробовал CountrySelectWidget, и он ничего не делает, кроме как просто добавляет флаг выбранной страны в качестве метки рядом с текстовым полем. Я не вижу, чтобы он делал что-то большее, чем это. Может быть, я ошибаюсь? Есть ли какие-либо другие преимущества в использовании CountrySelectWidget?