Передача текста-заполнителя с помощью django-filter и различных представлений

У меня есть модель:

class Movie (models.Model):
    category = models.CharField(max_length=50, verbose_name='Kategoria filmu', default= 'unassigned', null=False, choices=category_choices)
    source = models.CharField(max_length=50, verbose_name='Źródło filmu', default= 'unassigned', null=False, choices=source_choices)
    promotion = models.BooleanField(default=False, verbose_name='PROMOCJA FILMU')
    author = models.CharField(max_length=50, verbose_name='Nazwa influencera')
    title = models.CharField(max_length=50, verbose_name='Nazwa filmu')
    content = models.TextField(max_length=10000, verbose_name='HTML EMBEDED do filmu')
    date_posted = models.DateTimeField(default=timezone.now)
    youtube_url = models.URLField(blank=True, max_length=300)
    tiktok_url = models.URLField(blank=True, max_length=300)
    insta_url = models.URLField(blank=True, max_length=300)

Я передаю его в представление с помощью djnago-фильтра с различным выбором категории:

views.py:

#HotTop View
class HotTopView (FilterView):
    model = Movie
    template_name = 'pages/hot_top.html'
    filterset_class = MovieFilter 
    paginate_by = 6

    def get_queryset(self):
        category_qs = self.model.objects.filter(category="HOT-TOP")
        return category_qs.order_by('-date_posted')

#Odkrycia View
class OdkryciaView (FilterView):
    model = Movie
    template_name = 'pages/odkrycia.html'
    filterset_class = MovieFilter
    paginate_by = 6

    def get_queryset(self):
        category_qs = self.model.objects.filter(category="ODKRYCIA")
        return category_qs.order_by('-date_posted')

и мой filters.py:

class MovieFilter(django_filters.FilterSet):
    author = django_filters.CharFilter(label='', lookup_expr='contains',  widget=TextInput(attrs={'placeholder': 'Search'}))
    
    class Meta:
        model = Movie
        fields = ['author']

Вопрос в том, как я могу изменить placeholder моей формы поиска в зависимости от вида (HotTop или Odkrycia). Я хочу, чтобы это было - когда я в HotTop View -> Поиск в Hot Top и когда я в Odkrycia - > Поиск в Odkrycia

Думаю, вы могли бы передать аргумент

class MovieFilter(django_filters.FilterSet):
    author = django_filters.CharFilter(label='', lookup_expr='contains',  widget=TextInput(attrs={'placeholder': 'Search'}))
    
    class Meta:
        model = Movie
        fields = ['author']

    def __init__(self, *args, **kwargs):
        placeholder = kwargs.pop('placeholder', None)
        super().__init__(*args, **kwargs)
        if placeholder :
            self.fields['author'].widget = TextInput(attrs={'placeholder': f'Search in {placeholder}'})

и затем в представлениях вы можете использовать метод get_filterset_kwargs для передачи имени представления.

#HotTop View
class HotTopView(FilterView):
    ...
    def get_filterset_kwargs(self):
        kwargs = super(HotTopView, self).get_filterset_kwargs()           
        kwargs['placeholder'] = "Hot Top"           
        return kwargs
    ...

другая точка зрения:

#Odkrycia View
class OdkryciaView(FilterView):
    ...
    def get_filterset_kwargs(self):
        kwargs = super(OdkryciaView, self).get_filterset_kwargs()           
        kwargs['placeholder'] = "Odkrycia"           
        return kwargs
    ...

Надеюсь, это ответ на ваш вопрос.

Вернуться на верх