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

#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 были даны