Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
class FilterTodoForm(forms.Form): title_pattern = forms.CharField( max_length=Todo.MAX_TITLE_LENGTH, required=False, ) is_done = forms.BooleanField( required=False, ) class ListTodoView(views.ListView): model = Todo template_name = "web/list_todo.html" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["title"] = "Todos list" context["filter_form"] = FilterTodoForm( initial={ "title_pattern": self.get_title_pattern(), }, ) return context def get_queryset(self): queryset = super().get_queryset() queryset = self.apply_filter(queryset) return queryset def apply_filter(self, queryset): title_pattern = self.get_title_pattern() if title_pattern: queryset = queryset.filter(title__icontains=title_pattern) return queryset def get_title_pattern(self): return self.request.GET.get("title_pattern", None) def get_is_done_filter(self): return self.request.GET.get("is_done", None) == 'on' Когато override-нем метода get_context_data, можем да добавяме допълнителни данни в контекста, които след това да се визуализират в нашия template. Например, когато в template-а използваме {{ title }} (идващо от context["title"] = "Todos list"), на страницата ще се визуализира текстът "Todos list". Филтрация чрез формата: Създаваме форма FilterTodoForm, която съдържа полетата title_pattern и is_done за филтриране на задачите по заглавие и статус (завършена/незавършена). В метода get_queryset(self) се осъществява филтрирането: Първо, извикваме основния queryset чрез super().get_queryset(), който ни връща всички задачи по подразбиране. След това извикваме метода apply_filter, който прилага необходимите филтри върху този queryset. В метода apply_filter(self, queryset): Извикваме метода get_title_pattern() за да получим въведеното заглавие за търсене. Ако има въведен текст в полето за търсене (title_pattern), се филтрират задачите, чието заглавие съдържа този текст (title__icontains=title_pattern). Методът get_is_done_filter(self) връща дали полето is_done е маркирано (взема информацията от заявката GET). Ако има въведени критерии за филтрация (например заглавие или статус), те се прилагат чрез метода apply_filter. Визуализация на формата: За да визуализираме формата на страницата, добавяме я в контекста чрез context["filter_form"]. Например: context["filter_form"] = FilterTodoForm( initial={ "title_pattern": self.get_title_pattern(), } ) Чрез параметъра initial можем да запазим въведените данни във формата след натискане на бутона за търсене. Така ако потребителят търси по определени думи или статус, тези критерии ще останат визуализирани във формата след изпълнение на заявката. Ако потребителят маркира checkbox-а в HTML формата, при изпращане на заявката параметърът is_done ще има стойност 'on'. Това е стандартното поведение на HTML формите за checkbox полета – когато checkbox е маркиран, името на полето се изпраща със стойност 'on'. За да проверим дали checkbox-ът е маркиран, използваме следния код: self.request.GET.get("is_done", None) == 'on' Това сравнение проверява дали параметърът is_done е равен на 'on'. Ако checkbox-ът е маркиран, ще получим True, тъй като is_done е изпратено със стойност 'on'. Ако не е маркиран, is_done изобщо няма да бъде изпратено в заявката, и методът .get("is_done", None) ще върне None, което води до False. Затова добавяме == 'on' — за да проверим дали checkbox-ът е активен или не.
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)