#django #placeholder #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']
Вопрос в том, как я могу изменить заполнитель моей формы serach в зависимости от вида (горячая точка или Odkrycia). Я хочу, чтобы это было — когда я нахожусь в режиме горячей вершины -gt; gt;Поиск в горячей вершине и когда я нахожусь в Odkrycia — gt; gt;Поиск в Odkrycia
Ответ №1:
Я думаю, вы могли бы привести аргумент
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 ...
Я надеюсь, что это ответ на ваш вопрос.
Комментарии:
1. Tnaks ответа, он почти работает, но когда я пытаюсь позвонить HotTopView я получаю: get_filterset_kwargs() принимает 1 позиционный аргумент, но 2 были даны запрос метод: GET запрос URL-адреса: 127.0.0.1:8000/хот-топ Джанго версия: 3.2.8 тип исключения: ошибку TypeError значение исключения: get_filterset_kwargs() принимает 1 позиционный аргумент, но 2 были даны