Django-filter: рдПрдХ рдЕрдкрд░рд┐рдЪрд┐рдд рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ ImageField рдХреЗ рд▓рд┐рдП 'рд╕рдЯреАрдХ' рд▓реБрдХрдЕрдк рдХреЗ рд╕рд╛рде рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рд╣рд▓ рдлрд╝реАрд▓реНрдб 'рдЫрд╡рд┐' ...

рдХреЛ рдирд┐рд░реНрдорд┐рдд 24 рдЬреБрд▓ре░ 2017  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: carltongibson/django-filter

рдирдорд╕реНрддреЗ!
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рд╣реА рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рд╕реНрдЯреЛрд░ рдХреНрд▓рд╛рд╕ рд╡рд╛рд▓рд╛ рдПрдХ рдореЙрдбрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдЯреЛрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЫрд╡рд┐ = рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реАрд▓реНрдб рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛рдЫ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдореЗрдЬрдлрд┐рд▓реНрдбред

рдореИрдВрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдмрд╣рд┐рд╖реНрдХрд╛рд░ рдФрд░ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рднреА рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

class StoreFilter(django_filters.FilterSet):
    class Meta:
        model = Store
        exclude = ['image']
        fields = {
            'name': ['exact', 'contains'],
            'created': ['exact', 'year__gt'],
        }

рдпрд╣реА рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдореБрдЭреЗ рдЙрд╕ AssertionError рдХреЛ рдлреЗрдВрдХрддрд╛ рд░рд╣рддрд╛ рд╣реИ, рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ? рдЬреИрд╕реЗ рд╣реА рдореИрдВ рдЕрдкрдиреЗ model.py рдореЗрдВ рдЫрд╡рд┐ рд▓рд╛рдЗрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рдлрд╝реАрд▓реНрдб рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рди рдХреЗрд╡рд▓ рдирд╛рдо рдФрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдХрд┐рд╕реА рднреА рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред

рд╕рд╛рджрд░

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдп @msbt - рдореИрдВ рд╢рд░реНрдд рд▓рдЧрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдЫреЛрдбрд╝реА рдЧрдИ рд╣реИред рдореИрдВрдиреЗ рдПрдХ рддреНрд╡рд░рд┐рдд рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдпрд╛, рдФрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд AssertionError рдХреЛ рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдиреАрдЪреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЫрд╡рд┐ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлрд╝рд┐рд▓реНрдЯрд░ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

`` `рдкрд╛рдпрдерди

рдореЙрдбрд▓

django.db рдЖрдпрд╛рдд рдореЙрдбрд▓ рд╕реЗ

рдХреНрд▓рд╛рд╕ рд╕реНрдЯреЛрд░ (рдореЙрдбрд▓ред рдореЙрдбрд▓):
рдирд╛рдо = рдореЙрдбрд▓ред рдЪрд╛рд░рдлрд┐рд▓реНрдб (max_length = 80)
рдмрдирд╛рдпрд╛ = рдореЙрдбрд▓ред рдбреЗрдЯрдлрд┐рд▓реНрдб ()
рдЫрд╡рд┐ = рдореЙрдбрд▓ред рдЗрдореЗрдЬрдлрд┐рд▓реНрдб ()

рдлрд┐рд▓реНрдЯрд░

django_filters рдЖрдпрд╛рдд рдХрд░реЗрдВ

рдХреНрд▓рд╛рд╕ рд╕реНрдЯреЛрд░рдлрд┐рд▓реНрдЯрд░ (django_filters.FilterSet):
рд╡рд░реНрдЧ рдореЗрдЯрд╛:
рдореЙрдбрд▓ = рд╕реНрдЯреЛрд░
рдмрд╣рд┐рд╖реНрдХреГрдд = ['рдЫрд╡рд┐']
рдлрд╝реАрд▓реНрдб = {
'рдирд╛рдо': ['рд╕рдЯреАрдХ', 'рд╢рд╛рдорд┐рд▓ рд╣реИ'],
'рдмрдирд╛рдпрд╛': ['рд╕рдЯреАрдХ', 'рд╡рд░реНрд╖__gt'],
}

рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ

[8] рдореЗрдВ: StoreFilter.base_filters
рдЖрдЙрдЯ [8]:
рдСрд░реНрдбрд░реНрдб рдбрд┐рдХреНрдЯ ([('рдирд╛рдо',),
('рдирд╛рдо__ рд╢рд╛рдорд┐рд▓ рд╣реИ',),
('рдмрдирд╛рдпрд╛ рдерд╛',),
('рдмрдирд╛рдпрд╛__рд╡рд░реНрд╖__gt',)])
````

рдХреНрдпрд╛ рдЖрдк рдкреВрд░рд╛ рдореЙрдбрд▓ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдПрдХ рдЖрд╕реБрдд рдЙрджрд╛рд╣рд░рдг рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛ред

рд╕рднреА 11 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдп @msbt - рдореИрдВ рд╢рд░реНрдд рд▓рдЧрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдЫреЛрдбрд╝реА рдЧрдИ рд╣реИред рдореИрдВрдиреЗ рдПрдХ рддреНрд╡рд░рд┐рдд рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдпрд╛, рдФрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд AssertionError рдХреЛ рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдиреАрдЪреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЫрд╡рд┐ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлрд╝рд┐рд▓реНрдЯрд░ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

`` `рдкрд╛рдпрдерди

рдореЙрдбрд▓

django.db рдЖрдпрд╛рдд рдореЙрдбрд▓ рд╕реЗ

рдХреНрд▓рд╛рд╕ рд╕реНрдЯреЛрд░ (рдореЙрдбрд▓ред рдореЙрдбрд▓):
рдирд╛рдо = рдореЙрдбрд▓ред рдЪрд╛рд░рдлрд┐рд▓реНрдб (max_length = 80)
рдмрдирд╛рдпрд╛ = рдореЙрдбрд▓ред рдбреЗрдЯрдлрд┐рд▓реНрдб ()
рдЫрд╡рд┐ = рдореЙрдбрд▓ред рдЗрдореЗрдЬрдлрд┐рд▓реНрдб ()

рдлрд┐рд▓реНрдЯрд░

django_filters рдЖрдпрд╛рдд рдХрд░реЗрдВ

рдХреНрд▓рд╛рд╕ рд╕реНрдЯреЛрд░рдлрд┐рд▓реНрдЯрд░ (django_filters.FilterSet):
рд╡рд░реНрдЧ рдореЗрдЯрд╛:
рдореЙрдбрд▓ = рд╕реНрдЯреЛрд░
рдмрд╣рд┐рд╖реНрдХреГрдд = ['рдЫрд╡рд┐']
рдлрд╝реАрд▓реНрдб = {
'рдирд╛рдо': ['рд╕рдЯреАрдХ', 'рд╢рд╛рдорд┐рд▓ рд╣реИ'],
'рдмрдирд╛рдпрд╛': ['рд╕рдЯреАрдХ', 'рд╡рд░реНрд╖__gt'],
}

рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ

[8] рдореЗрдВ: StoreFilter.base_filters
рдЖрдЙрдЯ [8]:
рдСрд░реНрдбрд░реНрдб рдбрд┐рдХреНрдЯ ([('рдирд╛рдо',),
('рдирд╛рдо__ рд╢рд╛рдорд┐рд▓ рд╣реИ',),
('рдмрдирд╛рдпрд╛ рдерд╛',),
('рдмрдирд╛рдпрд╛__рд╡рд░реНрд╖__gt',)])
````

рдХреНрдпрд╛ рдЖрдк рдкреВрд░рд╛ рдореЙрдбрд▓ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдПрдХ рдЖрд╕реБрдд рдЙрджрд╛рд╣рд░рдг рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛ред

рдЕрд░реЗ, рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдФрд░ рд╕рдордп рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛, рдЕрдЧрд░ рдпрд╣ рдПрдХ рдзреЛрдЦреЗрдмрд╛рдЬрд╝ рдЧрд▓рддреА рдереА рддреЛ рд╢рд░реНрдордирд╛рдХ рд╣реЛрдЧрд╛;)

рд╣рд╛рдп @msbt - рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рдерд╛, рдпрд╛ рдЗрд╕реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рд╕рдордп рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджреЗрдВ рдФрд░ рдЬрдм рдореИрдВ рджреЛрдмрд╛рд░рд╛ рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВ рдФрд░ рдЕрдЯрдХ рдЬрд╛рдПрдВ;)

@msbt рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? рдореЗрд░реЗ рдкрд╛рд╕ рднреА рдРрд╕рд╛ рд╣реА рд╣реИ

@georgezouq рдбрд░ рдирд╣реАрдВ, рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдФрд░ рдХрднреА рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛

рдХреГрдкрдпрд╛ рдЯреНрд░реЗрд╕рдмреИрдХ рдХрд░реЗрдВред рдореИрдВ

Internal Server Error: /stadiums/
Traceback (most recent call last):
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django\views\generic\base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\*\PycharmProjects\pina_colada\venv\lib\site-packages\django\views\generic\base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\*\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\views.py", line 77, in get
    filterset_class = self.get_filterset_class()
  File "C:\Users\*\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\views.py", line 35, in get_filterset_class
    return filterset_factory(model=self.model, fields=self.filterset_fields)
  File "C:\Users\*\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\filterset.py", line 459, in filterset_factory
    (FilterSet,), {'Meta': meta})
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\filterset.py", line 71, in __new__
    new_class.base_filters = new_class.get_filters()
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\filterset.py", line 345, in get_filters
    filters[filter_name] = cls.filter_for_field(field, field_name, lookup_expr)
  File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\filterset.py", line 377, in filter_for_field
    ) % (cls.__name__, field_name, lookup_expr, field.__class__.__name__)
AssertionError: StadiumFilterSet resolved field 'graphic' with 'exact' lookup to an unrecognized field type FileField. Try adding an override to 'Meta.filter_overrides'. See: https://django-filter.readthedocs.io/en/master/ref/filterset.html#customise-filter-generation-with-filter-overrides
[13/Dec/2018 08:23:58] "GET /stadiums/?page=1 HTTP/1.1" 500 108150
class StadiumFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='iexact')

    class Meta:
        model = Stadium
        exclude = ['graphic']
        filter_overrides = {
            models.FileField: {
                'filter_class': django_filters,
                'extra': lambda f: {
                    'lookup_expr': 'icontains',
                },
            },
        }

@carlongibson рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ

рдпрд╣ рдореЗрд░реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЗрд╕рдиреЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдореБрд╡рдХреНрдХрд┐рд▓ рдореБрдЭреЗ рдЕрдкрдиреЗ рдлрд┐рд▓реНрдЯрд░ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдореЗрдВ рдкрд░реЗрд╢рд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдкрд░ рдЧреМрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

urlpatterns = [
    path('', views.StadiumFilterView.as_view(model=Stadium,
                                             filterset_fields=['name', 'country']), name="stadium_index"),
]

рдореЗрдЯрд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдб, рдмрд╣рд┐рд╖реНрдХреГрдд, рдлрд╝рд┐рд▓реНрдЯрд░_рдУрд╡рд░рд░рд╛рдЗрдб рдЗрд╕ AssertionError рддреНрд░реБрдЯрд┐ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрдм рдореИрдВ FilterView + filter_class = MyFilterSet рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдлрд╝реАрд▓реНрдб рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░_рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛,
рдЕрдиреНрдпрдерд╛ def filter_for_field(cls, f, name, lookup_expr='exact') рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЪрд▓реЗрдЧрд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕