Django Countries - невозможно предварительно выбрать нужную страну в форме редактирования
Рассмотрим эту модель:
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. У меня возникают проблемы с заполнением страны в двух случаях:
Когда страна - "United States" (это то, что возвращает webhook, я не контролирую это) - django_countries не распознает это, поэтому я добавил условие if для изменения "United States" на USA перед созданием нового объекта Address, но, когда страна не United States, например, "Panama", я ввожу ее непосредственно в модель, делая следующее:
country = request.POST.get('country') # returns something like "Panama"
Address.objects.create(line1=line1, city=city, state=state, country=country)
Все работает нормально, но когда я пытаюсь отредактировать форму "Адрес", поле страны пустое, оно не выбирает "Панаму" из опций. Я знаю, что поле country
этого экземпляра Address является объектом страны, потому что я могу сделать 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>
- Что касается проблемы с Соединенными Штатами: Я думаю, что лучший вариант для вас - настроить названия стран, как описано здесь .
from django.utils.translation import gettext_lazy as _
COUNTRIES_OVERRIDE = {
'NZ': _('Middle Earth'),
'AU': None,
'US': {'names': [
_('United States of America'),
_('America'),
],
}
- Пробовали ли вы использовать
CountrySelectWidget
как это ? Если нет, не могли бы вы попробовать и сказать, работает ли это для вас правильно?
from django_countries.widgets import CountrySelectWidget
class PersonForm(forms.ModelForm):
class Meta:
model = models.Person
fields = ('name', 'country')
widgets = {'country': CountrySelectWidget()}