Задать вопрос

Как задать в фильтре значение по умолчанию в форме Django?

Всем привет.

Пытаюсь отфильтровать данные на сайте с использованием FilterView.

Model
class Receipt(models.Model):
    receipt_date = models.CharField(max_length=20)
    name_seller = models.CharField(max_length=150)
    product_information = ArrayField(ArrayField(
            models.CharField(max_length=1000), default=list
        )
    )
    total_sum = models.CharField(max_length=20)

    def __str__(self):
        return self.name_seller

FilterForm

class ReceiptsFilter(filters.FilterSet):
    names_seller = Receipt.objects.values_list('id', 'name_seller', named=True).all()
    name_seller = filters.ChoiceFilter(label='Seller', choices=names_seller)

    class Meta:
        model = Receipt
        fields = ('name_seller', )


Views

class ReceiptView(FilterView):
    queryset = Receipt.objects.all()
    template_name = 'receipts/receipts.html'
    filterset_class = ReceiptsFilter
    filter_backends = (filters.DjangoFilterBackend,)

    error_message = gettext_lazy('У вас нет прав на просмотр данной страницы! '
                                 'Авторизуйтесь!')
    login_url = 'login'

    def get_context_data(self, *, object_list=None, **kwargs):
        name_seller = self.request.GET.get('name_seller')
        context = super().get_context_data(**kwargs)
        context['receipts'] = Receipt.objects.filter(
            pk=name_seller)
        return context


Когда я выбираю из выпадающего списка name_seller, фильтр срабатывает, но когда я ничего не выбираю, появляется ошибка Field 'id' expected a number but got ''., что ожидаемо, но как мне вывести все данные из модели Receipt когда не выбран name_seller?
  • Вопрос задан
  • 171 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
@Sanchez9891 Автор вопроса
Спасибо, Dr. Bacon, навёл меня на правильные мысли.
Оставляю код для потомков.

Удаляем get_context_data

class ReceiptView(FilterView):
    model = Receipt
    template_name = 'receipts/receipts.html'
    context_object_name = 'receipts'
    filterset_class = ReceiptsFilter
    filter_backends = (filters.DjangoFilterBackend,)

    error_message = gettext_lazy('У вас нет прав на просмотр данной страницы! '
                                 'Авторизуйтесь!')
    login_url = 'login'


В форме к QuerySet добавляем .distinct()

class ReceiptsFilter(django_filters.FilterSet):
    names_seller = Receipt.objects.values_list('name_seller', 'name_seller').distinct()
    name_seller = filters.ChoiceFilter(label='Seller', choices=names_seller)

    class Meta:
        model = Receipt
        fields = ('name_seller', )



В шаблоне должно получится так:
{% for receipt in object_list %}
{% endfor %}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы