У меня есть проблема с приложением django-фильтра: как скрыть объекты, которые приведут к нулевым результатам. Я думаю, что существует простой метод сделать это, но idk как.
Я использую LinkWidget на ModelChoiceFilter, как это:
provider = django_filters.ModelChoiceFilter(queryset=Provider.objects.all(),
widget=django_filters.widgets.LinkWidget)
То, что я должен сделать, отфильтровать queryset и выбрать только Поставщика, который приведет по крайней мере к одному результату и исключит другие. Существует способ сделать это?
По сути, вам нужно применить фильтры, и затем примените их снова, но для вновь созданного набора запросов. Примерно так:
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.
Боже! Уменьшите количество 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 для ссылок на другие модели.
Вызываемый метод может быть методом класса в вашей модели.
Если я правильно понял ваш вопрос, я полагаю, что вы хотите использовать 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