Заполнение ChoiceBlock данными сниппета

У меня есть фрагмент для кодов стран, и я хочу определить локализованные названия стран на корневых страницах для каждого локализованного сайта.

Фрагмент выглядит так:

@register_snippet
class Country(models.Model):
    iso_code = models.CharField(max_length=2, unique=True)

panels = [
    FieldPanel('iso_code'),
]

def get_iso_codes():
    try:
        countries = Country.objects.all()
        result = []
        for country in countries:
            result.append((country.iso_code,country.iso_code))
        return result
    except Country.DoesNotExist:
        return []

Теперь я хочу вызвать функцию get_iso_codes при создании блока выбора и заполнить варианты из фрагмента.

Блок выглядит так

class CountryLocalizedBlock(blocks.StructBlock):
    iso_code = blocks.ChoiceBlock(choices=Country.get_iso_codes(), unique=True)
    localized_name = blocks.CharBlock(required=True)

Однако при вызове makemigrations manage.py я получаю следующую ошибку:

psycopg2.ProgrammingError: relation "home_country" does not exist
LINE 1: ..."."iso_code", "home_country"."sample_number" FROM "home_coun...

Я могу обойти это, закомментировав «Country.objects.all()», а затем запустив makemigration и позже снова прочитав строку в коде, однако я бы предпочел решение, которое не требует этого обходного пути (также оно терпит неудачу, когда я запускаю ' manage.py collectstatic» при сборке перед развертыванием, и я не знаю, как это обойти, и застрял)


person realheri    schedule 31.10.2016    source источник


Ответы (1)


Я нашел решение, основанное на Трясогузка, как заполнить варианты выбора в ChoiceBlock из другой модели?

Класс страны остался нетронутым (за исключением того, что метод get_iso_codes теперь лишний). Я только что расширил Chooserblock и использую Country в качестве целевой_модели:

class CountryChooserBlock(blocks.ChooserBlock):
    target_model = Country
    widget = forms.Select

    def value_for_form(self, value):
        if isinstance(value, self.target_model):
            return value.pk
        else:
            return value

И использовал CountryChooserBlock вместо ChoiceBlock:

class CountryLocalizedBlock(blocks.StructBlock):
    iso_code = CountryChooserBlock(unique=True)
    localized_name = blocks.CharBlock(required=True)
person realheri    schedule 02.11.2016