Фильтрация полей формы Django путем прохождения более одного отношения (внешний ключ к внешнему ключу?) - PullRequest
3 голосов
/ 18 июня 2020

Сейчас я работаю с формой logi c, и моя задача кажется довольно простой - мне нужно реализовать форму с зависимыми полями: 1) Страна 2) Регион 3) Район (область)

Итак, у меня есть мои простые модели:

class CountryModel(models.Model):
    name = models.CharField('Country name', unique=False, max_length=128, blank=False, null=False)

class RegionModel(models.Model):
    name = models.CharField('Region name', unique=False, max_length=128, blank=False, null=False)
    country = models.ForeignKey(CountryModel, on_delete=models.CASCADE, blank=True, null=True)

class DistrictModel(models.Model):
    name = models.CharField('District name', unique=False, max_length=128, blank=False, null=False)
    region = models.ForeignKey(RegionModel, on_delete=models.CASCADE, blank=True, null=True)

class FormModel(models.Model):
    country = models.ForeignKey(CountryModel, on_delete=models.CASCADE, blank=True, null=True)
    region = models.ForeignKey(RegionModel, on_delete=models.CASCADE, blank=True, null=True)
    area = models.ForeignKey(AreaModel, on_delete=models.CASCADE, blank=True, null=True)

Это означает, что набор запросов для района зависит от выбранного региона, а набор запросов для региона зависит от выбранной страны. Я поместил свой лог c в метод формы init , и он выглядит так:

class SignCreateForm(ModelForm):
    data_url = '/sign-form-data/'

    class Meta:
        model = FormModel
        fields = ['country', 'region', 'district']

    dependencies = {'district': ('region', 'country'), 'region': ('country',)}

    class Media:
        # ajax form refreshing script
        js = ('js/formset.js',)

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

        if self.is_bound:
            if self.data['country']:
                self.fields['district'].limit_choices_to = {'country': self.data['country']}
                apply_limit_choices_to_to_formfield(self.fields['district'])

Но это не работает и вызывает ошибку: "Cannot resolve keyword 'country' into field. Choices are: id, name, region.." Вопрос в том, : Есть ли способ отфильтровать набор запросов моего района только по выбранной стране (без выбранного региона)? Я представляю это (в своей голове) как self.fields['district'].queryset.filter('region'=[1,2,3]) - но я не могу отфильтровать набор запросов полей по списку с помощью несколько значений. Надеюсь, кто-нибудь поможет мне найти правильный способ фильтрации моих районов по странам.

1 Ответ

2 голосов
/ 19 июня 2020

Вы можете просмотреть больше взаимосвязей, перечислив их все, соединенные двойным подчеркиванием, например, 'region' + '__' + 'country'. Страна недоступна напрямую из района, а только через регион в вашей модели.

self.fields['district'].limit_choices_to = {'region__country': self.data['country']}
...