Django-filter: FilterSet Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ» ΠΏΠΎΠ»Π΅ Β«ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Β» с Β«Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌΒ» поиском для нСраспознанного Ρ‚ΠΈΠΏΠ° поля ImageField...

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 24 июл. 2017  Β·  11ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: carltongibson/django-filter

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚!
Π― знаю, Ρ‡Ρ‚ΠΎ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΡƒΠΆΠ΅ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»Π°ΡΡŒ здСсь , Π½ΠΎ я просто Π½Π΅ ΠΌΠΎΠ³Ρƒ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Π£ мСня Π΅ΡΡ‚ΡŒ модСль с классом Store, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Ρ€Π°Π·Π»ΠΈΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅ с image = models.ImageField для отобраТСния ΠΏΡ€ΠΈ запросС ΠΊ Π½Π΅ΠΌΡƒ.

Π― ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» всС ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½ΠΎ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, ΠΎΠ½ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ поля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΡŽ.

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

Π­Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ ΠΎΠ½ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ΠΌΠ½Π΅ AssertionError, Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ, Ρ‡Ρ‚ΠΎ я ΠΌΠΎΠ³Ρƒ ΡƒΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ? Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ я ΠΏΡ€ΠΎΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽ строку изобраТСния Π² ΠΌΠΎΠ΅ΠΌ Ρ„Π°ΠΉΠ»Π΅ models.py, ΠΎΠ½Π° Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ (Π½ΠΎ Π² Π½Π΅ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ всС поля, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ имя ΠΈ созданноС, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… я выполнял Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ. Π›ΡŽΠ±Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ†Π΅Π½Π΅Π½Ρ‹.

Π‘ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌΠΈ поТСланиями

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ , @msbt. Π“ΠΎΡ‚ΠΎΠ² ΠΏΠΎΡΠΏΠΎΡ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ здСсь ΡƒΠΏΡƒΡ‰Π΅Π½Π° нСкоторая информация. Π― ΠΏΡ€ΠΎΠ²Π΅Π» быстрый тСст, ΠΈ упомянутыС AssertionError Π½Π΅ поднялись. Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΈΠΆΠ΅, Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ для ΠΏΠΎΠ»Π΅ΠΉ изобраТСния создан Π½Π΅ Π±Ρ‹Π».

```ΠΏΠΈΡ‚ΠΎΠ½

ΠΌΠΎΠ΄Π΅Π»ΠΈ

ΠΈΠ· ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° django.db

Магазин класса (модСли.МодСль):
имя = модСли.CharField(max_length=80)
создано = модСли.DateField()
ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ = ΠΌΠΎΠ΄Π΅Π»ΠΈ.ImageField()

Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ django_filters

класс StoreFilter (django_filters.FilterSet):
ΠœΠ΅Ρ‚Π° класса:
модСль = Магазин
ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ = ['ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅']
поля = {
'имя': ['Ρ‚ΠΎΡ‡Π½ΠΎΠ΅', 'содСрТит'],
'создано': ['Ρ‚ΠΎΡ‡Π½ΠΎ', 'Π³ΠΎΠ΄__Π³Ρ‚'],
}

ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄

Π’ [8]: StoreFilter.base_filters
Π’Ρ‹Ρ…ΠΎΠ΄[8]:
OrderedDict([('имя',),
('имя__содСрТит',),
('созданный',),
('создано__Π³ΠΎΠ΄__Π³Ρ‚',)])
````

НС ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ модСль ΠΈ ΠΊΠΎΠ΄ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°? Если Π½Π΅Ρ‚, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π΅Π½ дистиллированный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

ВсС 11 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ , @msbt. Π“ΠΎΡ‚ΠΎΠ² ΠΏΠΎΡΠΏΠΎΡ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ здСсь ΡƒΠΏΡƒΡ‰Π΅Π½Π° нСкоторая информация. Π― ΠΏΡ€ΠΎΠ²Π΅Π» быстрый тСст, ΠΈ упомянутыС AssertionError Π½Π΅ поднялись. Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΈΠΆΠ΅, Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ для ΠΏΠΎΠ»Π΅ΠΉ изобраТСния создан Π½Π΅ Π±Ρ‹Π».

```ΠΏΠΈΡ‚ΠΎΠ½

ΠΌΠΎΠ΄Π΅Π»ΠΈ

ΠΈΠ· ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° django.db

Магазин класса (модСли.МодСль):
имя = модСли.CharField(max_length=80)
создано = модСли.DateField()
ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ = ΠΌΠΎΠ΄Π΅Π»ΠΈ.ImageField()

Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ django_filters

класс StoreFilter (django_filters.FilterSet):
ΠœΠ΅Ρ‚Π° класса:
модСль = Магазин
ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ = ['ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅']
поля = {
'имя': ['Ρ‚ΠΎΡ‡Π½ΠΎΠ΅', 'содСрТит'],
'создано': ['Ρ‚ΠΎΡ‡Π½ΠΎ', 'Π³ΠΎΠ΄__Π³Ρ‚'],
}

ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄

Π’ [8]: StoreFilter.base_filters
Π’Ρ‹Ρ…ΠΎΠ΄[8]:
OrderedDict([('имя',),
('имя__содСрТит',),
('созданный',),
('создано__Π³ΠΎΠ΄__Π³Ρ‚',)])
````

НС ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ модСль ΠΈ ΠΊΠΎΠ΄ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°? Если Π½Π΅Ρ‚, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π΅Π½ дистиллированный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

Π­ΠΉ, спасибо, Ρ‡Ρ‚ΠΎ Π²Π΅Ρ€Π½ΡƒΠ»ΠΈΡΡŒ ΠΊΠΎ ΠΌΠ½Π΅! Π”Π°ΠΉΡ‚Π΅ ΠΌΠ½Π΅ Π΅Ρ‰Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ я ΠΌΠΎΠ³ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅Π»ΠΎΠ²ΠΊΠΎ, Ссли Π±Ρ‹ это Π±Ρ‹Π»Π° ошибка Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°;)

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ @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',
                },
            },
        }

@carltongibson моТСшь ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ

ΠΎΠ½ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π» ΠΌΠΎΠΈ пСрСопрСдСлСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ я использовал ΠΎΠ±Ρ‰ΠΈΠΉ Π²ΠΈΠ΄. это Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ€Π΅ΡˆΠΈΠ»ΠΎ мою ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π½ΠΎ ΠΌΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ бСспокоит мСня спСцификой своих Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ², Π»ΠΎΠ». НС ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ это

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

поля, ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, filter_overrides Π² Meta Π½Π΅ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ AssertionError , ΠΊΠΎΠ³Π΄Π° я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ FilterView + filter_class = MyFilterSet , я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ filter_fields Π² прСдставлСнии, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ поля,
ΠΈΠ½Π°Ρ‡Π΅ def filter_for_field(cls, f, name, lookup_expr='exact') Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· всС поля

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

gotexis picture gotexis  Β·  4ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

ses4j picture ses4j  Β·  4ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

GuillaumeCisco picture GuillaumeCisco  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

inakrin picture inakrin  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

blueyed picture blueyed  Β·  4ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ