#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:
- Как насчет проблемы с Соединенными Штатами: я думаю, что лучшим вариантом для вас будет настроить названия стран, как описано здесь .
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()}
Комментарии:
1. Я попробовал CountrySelectWidget, и он ничего не делает, кроме как просто добавляет флаг выбранной страны в качестве метки рядом с текстовым полем. Я не вижу, чтобы он делал что-то большее, чем это. Может быть, я ошибаюсь? Есть ли какие-либо другие преимущества в использовании CountrySelectWidget?