vikkyshostak
@vikkyshostak
< This head full of dreams.

Django. Как вывести поле ForeignKey в шаблон с определённым условием?

Hello World!

Подскажите, пожалуйста, как вывести поле ForeignKey в шаблон с определённым условием?
Всё происходит в Django 1.11.5.

Имею вот такую модель:
# ./citizenship/models.py
class Citizenship(models.Model):
    name = models.CharField(_('Country name'), max_length=55, unique=True)
    is_active = models.BooleanField(default=True)
    is_available_for_order = models.BooleanField(default=True)

class CitizenshipInvitationPrice(models.Model):
    country = models.ForeignKey(Citizenship, on_delete=models.CASCADE)
    type = models.CharField(_('Type'), max_length=25, default=None)
    cost = models.IntegerField(_('Cost, RUR'), default=0)

Подключаю её к другой модели:
# ./visa/models.py
class TouristVisaSupport(models.Model):
    citizenship = models.ForeignKey(Citizenship, on_delete=None)
...

Которая имеет вот такую вьюшку:
# ./visa/views.py
class TouristVisaSupportView(View):
    template_name = 'visa/index.html'
    form_class = TouristVisaSupportForm

    def get(self, request):
        form = self.form_class()
        return render(request, self.template_name, {'form': form})

Виджет формы для этого поля:
# ./visa/forms.py
class TouristVisaSupportForm(forms.ModelForm):
    class Meta:
        model = TouristVisaSupport
        widgets = {
            'citizenship': forms.Select(
                attrs={
                    'class': 'citizenship-select',
                },
            ),
...

В шаблоне вывожу, как обычно:
<!-- ./templates/visa/index.html -->
{{ form.as_p }}
...


Хотелось бы во вьюшке сразу же фильтровать значения из ForeignKey поля citizenship по, например, значению type из класса CitizenshipInvitationPrice. То есть, из всех значений, попадёт в select только то, которое удовлетворяет условию фильтра.

Подскажите, пожалуйста, как это можно сделать?
  • Вопрос задан
  • 1667 просмотров
Решения вопроса 1
vikkyshostak
@vikkyshostak Автор вопроса
< This head full of dreams.
Разобрался сам.

Всего-то, нужно было переопределить это поле во вьюхе + annotate, чтобы дубликаты не выводились:
# ./visa/views.py
from django.db.models import Avg

class TouristVisaSupportView(View):
    ...
    def get(self, request):
        form = self.form_class()
        form.fields['citizenship'].queryset = Citizenship.objects.filter(citizenshipinvitationprice__type=1).annotate(Avg('id'))
        return render(request, self.template_name, {'form': form})
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы