Фильтрация таблицы django-tables2 с помощью django-фильтров с помощью выпадающего списка - PullRequest
0 голосов
/ 19 мая 2018

У меня есть модель (Brief), которую я показываю в списке с Django-tables2.Бриф может принадлежать одной или нескольким башням.Я пытаюсь создать представление, где пользователь может видеть все сводки, а затем фильтровать, чтобы найти сводки, относящиеся к конкретной башне.Сначала я реализовал это с помощью флажков, и это работало, но мне нужно включить этот фильтр в выпадающий список.

«ПОЛУЧИТЬ / бриф /? Башни = HTTP / 1.1» - дает мне все сводки.«GET /rief /? Towers = 1 HTTP / 1.1» - выдает пустой список сводок (в моих тестовых данных должно быть 2). Запросы в оболочке django дают ожидаемые результаты.

Другойстранное поведение - в моем выпадающем списке есть пробелы, которые можно выбрать.

class Attribute(models.Model):

    class Meta:
        abstract = True
        ordering = ['name']

    name = models.CharField(max_length=100, unique=True)
    created_on = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(User, related_name='% 
       (class)s_created_by', null=True, blank=True, 
           on_delete=models.SET_NULL)
    modified_dt = models.DateTimeField(auto_now=True)
    modified_by = models.ForeignKey(User, related_name='% 
       (class)s_modified_by', null=True, blank=True, 
           on_delete=models.SET_NULL)

    def __str__(self):
        return self.name


class Tower(Attribute):
    pass


class Brief (Attribute):
   link = models.URLField()
   sources = models.ManyToManyField(SourceSystem)
   format = models.ForeignKey(ReportFormat, on_delete=models.PROTECT)
   towers = models.ManyToManyField(Tower)
   type = models.ForeignKey(ReportType, on_delete=models.PROTECT)
   project = models.ForeignKey(Project, on_delete=models.PROTECT)

   def tower_list(self):
      return ", ".join([str(obj) for obj in self.towers.all()])

   def source_list(self):
      return ", ".join([str(obj) for obj in self.sources.all()])

Мои таблицы.py:

class BriefTable(tables.Table):
    name = tables.LinkColumn('brief_detail', args=[A('pk')])

    class Meta:
        model = Brief
        template_name = 'django_tables2/bootstrap.html'
        sequence = ('id', 'name', 'type', 'project', 'format',)
        exclude = ('link', 'created_on', 'created_by', 'modified_dt', 'modified_by', 'info')

Мои фильтры.py

class BriefFilter(django_filters.FilterSet):
    towers=django_filters.ModelMultipleChoiceFilter(
        queryset=Tower.objects.all(), widget=forms.Select)
    class Meta:
        model = Brief
        fields = ['towers']

мой взгляд:

class FilteredBriefListView(LoginRequiredMixin, SingleTableMixin, 
    FilterView):
    table_class = BriefTable
    template_name = 'brief/brief_list.html'
    paginate_by = 20
    filterset_class = BriefFilter

наконец-то мойМаршрут:

urlpatterns = [
    path('', FilteredBriefListView.as_view(), name="home"),
]

1 Ответ

0 голосов
/ 19 мая 2018

После небольшого перерыва я понял, что я использую ModelMultipleChoiceFilter с одним выбором вместо ModelChoiceFilter ... / facepalm.

...