Как добавить методы к динамически создаваемым классам в python? - PullRequest
0 голосов
/ 02 марта 2020
from django.contrib import admin

from .filters import DropdownFilter

from django.db.models import Q

from django.utils.translation import gettext_lazy as  _

from .models import User


def queryset(self, request, queryset):
    term = self.value()
    if term is None:
        return
    term = term.lower
    username = Q()
    for bit in term.spilt():
        username = Q(username, queryset)
        return queryset.filter(username)


class InputFilter(admin.filters.SimpleListFilter):

   template = 'admin/input_filter.html'

   def lookups(self, request, model_admin):
      # Dummy, required to show the filter.
      return ((),)

   def choices(self, changelist):
      # Grab only the "all" option.
      all_choice = next(super().choices(changelist))
      all_choice['query_parts'] = ((k, v)for k, v in changelist.get_filters_params().items() if k != self.parameter_name)
      yield all_choice


class TransactionAdmin(admin.ModelAdmin):
    list_display = [field.name for field in User._meta.fields]
    c = type('UserFilter',(InputFilter,),{'title' : _('title'),'parameter_name' : 'search', 'query': queryset})
    c.queryset = queryset
    list_filter = [type('UserFilter',(InputFilter,),{'title' : _(i),'parameter_name' : i, 'query': queryset}) for i in list_display]

admin.site.register(User, TransactionAdmin)

Код предназначен для создания пользовательских фильтров ввода текста на сайте администратора django, здесь я хочу передать каждое имя поля заголовку, и я добавил функцию queryset в динамически создаваемый класс, но похоже это не работает, и я получил сообщение об ошибке, как показано ниже

  NotImplementedError at /admin/epic/user/

  subclasses of ListFilter must provide a queryset() method

Как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 02 марта 2020
list_filter = [type('UserFilter',(InputFilter,),{'title' : _(i),'parameter_name' : i, 'queryset': queryset}) for i in list_display]

Сейчас работает.

0 голосов
/ 02 марта 2020

Вы должны вызывать функцию с фигурными скобками, например queryset ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...