Скройте объекты фильтра, которые приводят к нулевым результатам в django-фильтре

У меня есть проблема с приложением django-фильтра: как скрыть объекты, которые приведут к нулевым результатам. Я думаю, что существует простой метод сделать это, но idk как.

Я использую LinkWidget на ModelChoiceFilter, как это:

provider = django_filters.ModelChoiceFilter(queryset=Provider.objects.all(), 
    widget=django_filters.widgets.LinkWidget) 

То, что я должен сделать, отфильтровать queryset и выбрать только Поставщика, который приведет по крайней мере к одному результату и исключит другие. Существует способ сделать это?

5
задан S.Lott 2 February 2010 в 12:52
поделиться

3 ответа

По сути, вам нужно применить фильтры, и затем примените их снова, но для вновь созданного набора запросов. Примерно так:

f = SomeFilter(request.GET) 
f = SomeFilter(request.GET, queryset=f.qs)

Теперь, когда у вас есть правильный набор запросов, вы можете динамически переопределять поставщиков в init :

def __init__(self, **kw):
   super(SomeFilter, self).__init__(**kw)
   self.filters['provider'].extra['queryset'] = Provider.objects.filter(foo__in=self.queryset)

Не очень красиво, но работает. Вероятно, вам следует инкапсулировать эти два вызова в более эффективный метод filter.

3
ответ дан 15 December 2019 в 06:26
поделиться

Боже! Уменьшите количество DLL!

Конечно, если вы собираетесь загрузить 200 DLL при запуске, это повлечет за собой кучу жестких ошибок страницы, и уйдет навсегда на загрузку (как 3ds max).

Переосмыслите стратегию DLL. Объединение большого количества небольших DLL-библиотек в более крупные. Я серьезно сомневаюсь, что тебе нужно 200 +.

И посмотрите Пять вещей, которые каждый Win32 программист должен знать .

-121--4648418-

Закольцовывание строк, обновление значений по мере продвижения - это определенно решение, и довольно простое:

foreach (DataRow row in table.Rows)
{
    if (row.IsNull("foo")) row["foo"] = "-";
    if (row.IsNull("bar")) row["bar"] = "-";
    row["date"] = ((DateTime)row["date"]).Date;
}

Можно также создать новые столбцы в таблице, используя выражения для автоматического создания содержимого:

table.Columns.Add("foo_dash", typeof(string), "IsNull(foo, '-')");
table.Columns.Add("bar_dash", typeof(string), "IsNull(bar, '-')");

(Я не знаю функции даты в ADO.NET, так что вы должны будете определить последний из них самостоятельно.)

Вы отметили свой пост ASP.NET, поэтому я думаю, что разумно предположить, что вы собираетесь связать ваш DataTable с каким-то управлением данных из нескольких записей ( GridView , Repeater и т.д.). Если это так, то, возможно, лучше будет выполнить преобразования во время привязки данных:

protected void theGrid_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    var data = e.DataItem as DataRowView;
    if (data != null)
    {
        if (data.Row.IsNull("foo")) e.Row.Cells[0] = "-";
        if (data.Row.IsNull("bar")) e.Row.Cells[0] = "-";
    }
}

Хотя это, кажется, требует немного больше кода, это также дает вам больше гибкости. Пример:

if (data.Row.IsNull("importantField")) e.Row.CssClass = "error";

В GridView дата может быть отформатирована с помощью DataFormatString в объявлении столбца:

<asp:BoundField DataField="data" DataFormatString="{0:d}" />

Аналогично при привязке данных к Repeater :

<%# Eval("date", "{0:d}") %>
-121--5044555-

Возможно, кверисет может быть вызываемым вместо «вещественного» Таким образом, он может генерироваться динамически. По крайней мере, это работает в Django Models для ссылок на другие модели.

Вызываемый метод может быть методом класса в вашей модели.

0
ответ дан 15 December 2019 в 06:26
поделиться

Если я правильно понял ваш вопрос, я полагаю, что вы хотите использовать AllValuesFilter.

import django_tables

provider = django_filters.AllValuesFilter(
    widget=django_filters.widgets.LinkWidget)

Более подробную информацию можно найти здесь: http://github.com/alex/django-filter/blob/master/docs/ref/filters.txt#L77

0
ответ дан 15 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

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