pl:python:views
Różnice
Różnice między wybraną wersją a wersją aktualną.
| Poprzednia rewizja po obu stronachPoprzednia wersjaNowa wersja | Poprzednia wersja | ||
| pl:python:views [2023/12/07 09:38] – [DateDetailView] sindap | pl:python:views [2023/12/07 19:36] (aktualna) – [ProcessFormView] sindap | ||
|---|---|---|---|
| Linia 719: | Linia 719: | ||
| W szablonie HTML możemy używać specjalnych zmiennych dostarczanych przez ten widok, takich jak '' | W szablonie HTML możemy używać specjalnych zmiennych dostarczanych przez ten widok, takich jak '' | ||
| ====== Class-based views mixins ====== | ====== Class-based views mixins ====== | ||
| + | |||
| + | Klasy '' | ||
| + | |||
| + | Najczęściej klasy '' | ||
| + | |||
| + | 1. **Współdzielenia kodu:** | ||
| + | * Klasy '' | ||
| + | |||
| + | 2. **Dodawania funkcjonalności: | ||
| + | * Klasy '' | ||
| + | |||
| + | 3. **Rozszerzania funkcjonalności widoków:** | ||
| + | * '' | ||
| + | |||
| + | Przykład użycia klasy '' | ||
| + | |||
| + | <code python> | ||
| + | from django.contrib.auth.mixins import LoginRequiredMixin | ||
| + | from django.views.generic import ListView | ||
| + | from .models import YourModel | ||
| + | |||
| + | class YourModelListView(LoginRequiredMixin, | ||
| + | model = YourModel | ||
| + | template_name = ' | ||
| + | context_object_name = ' | ||
| + | paginate_by = 10 | ||
| + | </ | ||
| + | |||
| + | W tym przykładzie '' | ||
| ===== Simple mixins ===== | ===== Simple mixins ===== | ||
| ==== ContextMixin ==== | ==== ContextMixin ==== | ||
| + | |||
| + | '' | ||
| + | |||
| + | Poniżej przedstawiam kilka przykładów zastosowań '' | ||
| + | |||
| + | 1. **Dodawanie dodatkowych danych do kontekstu: | ||
| + | * '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic import TemplateView | ||
| + | from django.contrib.auth.models import User | ||
| + | |||
| + | class MyContextView(ContextMixin, | ||
| + | template_name = ' | ||
| + | |||
| + | def get_context_data(self, | ||
| + | context = super().get_context_data(**kwargs) | ||
| + | context[' | ||
| + | context[' | ||
| + | return context | ||
| + | </ | ||
| + | |||
| + | W tym przykładzie '' | ||
| + | |||
| + | 2. **Przekazywanie dynamicznych danych do kontekstu: | ||
| + | * Można używać '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic import DetailView | ||
| + | from .models import Article | ||
| + | |||
| + | class ArticleDetailView(ContextMixin, | ||
| + | model = Article | ||
| + | template_name = ' | ||
| + | |||
| + | def get_context_data(self, | ||
| + | context = super().get_context_data(**kwargs) | ||
| + | context[' | ||
| + | return context | ||
| + | </ | ||
| + | |||
| + | W tym przykładzie '' | ||
| + | |||
| + | 3. **Współdzielenie danych między różnymi widokami:** | ||
| + | * '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic import ListView | ||
| + | from .models import Category | ||
| + | |||
| + | class CategoryListView(ContextMixin, | ||
| + | model = Category | ||
| + | template_name = ' | ||
| + | |||
| + | def get_context_data(self, | ||
| + | context = super().get_context_data(**kwargs) | ||
| + | context[' | ||
| + | return context | ||
| + | </ | ||
| + | |||
| + | Tutaj '' | ||
| + | |||
| + | Dzięki '' | ||
| ==== TemplateResponseMixin ==== | ==== TemplateResponseMixin ==== | ||
| + | |||
| + | '' | ||
| + | |||
| + | 1. **Renderowanie i zwracanie odpowiedzi opartej na szablonie: | ||
| + | * '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic import TemplateView | ||
| + | from django.contrib.auth.mixins import LoginRequiredMixin | ||
| + | |||
| + | class MyTemplateView(LoginRequiredMixin, | ||
| + | template_name = ' | ||
| + | </ | ||
| + | |||
| + | W tym przykładzie '' | ||
| + | |||
| + | 2. **Przekazywanie danych do szablonu:** | ||
| + | * '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic import TemplateView | ||
| + | |||
| + | class MyDataView(TemplateResponseMixin, | ||
| + | template_name = ' | ||
| + | |||
| + | def get_context_data(self, | ||
| + | context = super().get_context_data(**kwargs) | ||
| + | context[' | ||
| + | return context | ||
| + | </ | ||
| + | |||
| + | W tym przypadku '' | ||
| + | |||
| + | 3. **Obsługa różnych rodzajów odpowiedzi: | ||
| + | * '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic import TemplateView | ||
| + | from django.http import JsonResponse | ||
| + | |||
| + | class MyDataView(TemplateResponseMixin, | ||
| + | template_name = ' | ||
| + | |||
| + | def render_to_response(self, | ||
| + | if self.request.is_ajax(): | ||
| + | # Jeśli to jest żądanie AJAX, zwróć odpowiedź JSON | ||
| + | return JsonResponse({' | ||
| + | else: | ||
| + | # W przeciwnym razie zwróć standardową odpowiedź HTML | ||
| + | return super().render_to_response(context, | ||
| + | </ | ||
| + | |||
| + | Tutaj '' | ||
| + | |||
| + | '' | ||
| ===== Single object mixins ===== | ===== Single object mixins ===== | ||
| ==== SingleObjectMixin ==== | ==== SingleObjectMixin ==== | ||
| + | |||
| + | '' | ||
| + | |||
| + | 1. **Widok szczegółowy (DetailView): | ||
| + | * '' | ||
| + | |||
| + | 2. **Edycja pojedynczego obiektu (UpdateView): | ||
| + | * Jeśli chcesz utworzyć widok do edycji pojedynczego obiektu modelu, możesz użyć '' | ||
| + | |||
| + | 3. **Usunięcie pojedynczego obiektu (DeleteView): | ||
| + | * Podobnie jak w przypadku edycji, '' | ||
| + | |||
| + | 4. **Własne widoki oparte na jednym obiekcie:** | ||
| + | * Jeśli potrzebujesz dostosować widok do specyficznych potrzeb, w których pracujesz z pojedynczym obiektem, ale nie pasuje to do standardowych widoków, możesz skorzystać z '' | ||
| + | |||
| + | Przykład użycia '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic.detail import SingleObjectMixin | ||
| + | from django.shortcuts import render | ||
| + | from .models import YourModel | ||
| + | |||
| + | class YourDetailView(SingleObjectMixin): | ||
| + | model = YourModel | ||
| + | template_name = ' | ||
| + | |||
| + | def get(self, request, *args, **kwargs): | ||
| + | # Pobierz pojedynczy obiekt modelu | ||
| + | self.object = self.get_object(queryset=YourModel.objects.all()) | ||
| + | return render(request, | ||
| + | </ | ||
| + | |||
| + | W tym przykładzie '' | ||
| + | |||
| + | Można założyć, że widok oparty na '' | ||
| + | |||
| + | Podobieństwa między widokiem '' | ||
| + | |||
| + | 1. **Pobieranie pojedynczego obiektu:** | ||
| + | * '' | ||
| + | |||
| + | 2. **Przekazywanie obiektu do szablonu:** | ||
| + | * Po pobraniu obiektu, można przekazać go do szablonu, podobnie jak w przypadku widoku FBV. | ||
| + | |||
| + | 3. **Dodatkowe operacje na obiekcie:** | ||
| + | * Możesz dostosować widok, aby wykonywał dodatkowe operacje na pobranym obiekcie przed przekazaniem go do szablonu. | ||
| + | |||
| + | Przykładowo, | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic.detail import SingleObjectMixin | ||
| + | from django.shortcuts import render | ||
| + | from .models import YourModel | ||
| + | |||
| + | class YourDetailView(SingleObjectMixin): | ||
| + | model = YourModel | ||
| + | template_name = ' | ||
| + | |||
| + | def get(self, request, *args, **kwargs): | ||
| + | # Pobierz pojedynczy obiekt modelu | ||
| + | self.object = self.get_object(queryset=YourModel.objects.all()) | ||
| + | | ||
| + | # Dodatkowe operacje na obiekcie (opcjonalne) | ||
| + | # ... | ||
| + | |||
| + | return render(request, | ||
| + | </ | ||
| + | |||
| + | W kodzie powyżej, '' | ||
| ==== SingleObjectTemplateResponseMixin ==== | ==== SingleObjectTemplateResponseMixin ==== | ||
| Linia 736: | Linia 952: | ||
| ==== MultipleObjectMixin ==== | ==== MultipleObjectMixin ==== | ||
| + | '' | ||
| + | |||
| + | Główne zastosowania '' | ||
| + | |||
| + | 1. **Wyświetlanie listy obiektów: | ||
| + | * Najczęstszym zastosowaniem '' | ||
| + | |||
| + | 2. **Filtrowanie i sortowanie listy:** | ||
| + | * '' | ||
| + | |||
| + | 3. **Paginacja wyników:** | ||
| + | * W przypadku, gdy lista obiektów jest duża, '' | ||
| + | |||
| + | Przykład użycia '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic import ListView | ||
| + | from .models import YourModel | ||
| + | |||
| + | class YourListView(MultipleObjectMixin, | ||
| + | model = YourModel | ||
| + | template_name = ' | ||
| + | context_object_name = ' | ||
| + | paginate_by = 10 # liczba obiektów na stronę | ||
| + | |||
| + | def get_queryset(self): | ||
| + | # Dodatkowe operacje na zestawie danych (opcjonalne) | ||
| + | # ... | ||
| + | | ||
| + | return YourModel.objects.all() | ||
| + | </ | ||
| + | |||
| + | W tym przykładzie '' | ||
| + | |||
| + | Można przyjąć, że klasę '' | ||
| + | |||
| + | Przykładowo: | ||
| + | |||
| + | 1. **SingleObjectMixin: | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Przykład z '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic import DetailView | ||
| + | from django.views.generic.detail import SingleObjectMixin | ||
| + | from .models import YourModel | ||
| + | |||
| + | class YourDetailView(SingleObjectMixin, | ||
| + | model = YourModel | ||
| + | template_name = ' | ||
| + | context_object_name = ' | ||
| + | </ | ||
| + | |||
| + | 2. **MultipleObjectMixin: | ||
| + | * '' | ||
| + | * Inne widoki, które operują na listach obiektów takie jak:'' | ||
| + | |||
| + | Przykład z '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic import ListView | ||
| + | from django.views.generic.list import MultipleObjectMixin | ||
| + | from .models import YourModel | ||
| + | |||
| + | class YourListView(MultipleObjectMixin, | ||
| + | model = YourModel | ||
| + | template_name = ' | ||
| + | context_object_name = ' | ||
| + | paginate_by = 10 | ||
| + | </ | ||
| + | |||
| + | Stosowanie odpowiednich '' | ||
| ==== MultipleObjectTemplateResponseMixin ==== | ==== MultipleObjectTemplateResponseMixin ==== | ||
| Linia 742: | Linia 1033: | ||
| ==== FormMixin ==== | ==== FormMixin ==== | ||
| + | '' | ||
| + | |||
| + | '' | ||
| + | |||
| + | Poniżej znajduje się przykład użycia '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic.edit import CreateView | ||
| + | from django.views.generic.edit import FormMixin | ||
| + | from .models import YourModel | ||
| + | from .forms import YourModelForm | ||
| + | |||
| + | class YourCreateView(FormMixin, | ||
| + | model = YourModel | ||
| + | form_class = YourModelForm | ||
| + | template_name = ' | ||
| + | success_url = '/ | ||
| + | |||
| + | def form_valid(self, | ||
| + | # Wywołuje się, gdy formularz jest poprawny. | ||
| + | # Tutaj możesz dodać dodatkową logikę przed zapisaniem formularza. | ||
| + | return super().form_valid(form) | ||
| + | </ | ||
| + | |||
| + | W tym przypadku '' | ||
| + | |||
| + | Podsumowując, | ||
| ==== ModelFormMixin ==== | ==== ModelFormMixin ==== | ||
| + | W Django, klasa '' | ||
| + | |||
| + | Oto przykład użycia '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic.edit import CreateView | ||
| + | from django.urls import reverse_lazy | ||
| + | from .models import YourModel | ||
| + | from .forms import YourModelForm | ||
| + | |||
| + | class YourCreateView(ModelFormMixin, | ||
| + | model = YourModel | ||
| + | form_class = YourModelForm | ||
| + | template_name = ' | ||
| + | success_url = reverse_lazy(' | ||
| + | |||
| + | def form_valid(self, | ||
| + | # Dodatkowe działania po poprawnej walidacji formularza | ||
| + | return super().form_valid(form) | ||
| + | </ | ||
| + | |||
| + | W powyższym przykładzie '' | ||
| + | |||
| + | Podobnie można użyć '' | ||
| ==== ProcessFormView ==== | ==== ProcessFormView ==== | ||
| + | |||
| + | W Django, klasa '' | ||
| + | |||
| + | '' | ||
| + | |||
| + | Oto przykład użycia '' | ||
| + | |||
| + | <code python> | ||
| + | from django.views.generic.edit import ProcessFormView | ||
| + | from django.http import HttpResponseRedirect | ||
| + | from django.urls import reverse | ||
| + | from .forms import YourForm | ||
| + | |||
| + | class YourCustomFormView(ProcessFormView): | ||
| + | form_class = YourForm | ||
| + | template_name = ' | ||
| + | |||
| + | def form_valid(self, | ||
| + | # Dodatkowe operacje po poprawnej walidacji formularza | ||
| + | # Możesz dostosować to do swoich potrzeb, na przykład zapisywanie dodatkowych danych | ||
| + | return HttpResponseRedirect(reverse(' | ||
| + | </ | ||
| + | |||
| + | W tym przykładzie '' | ||
| + | |||
| + | W praktyce, jednak najczęściej korzystasz z bardziej specjalizowanych klas widoków, które korzystają z '' | ||
| ==== DeletionMixin ==== | ==== DeletionMixin ==== | ||
pl/python/views.1701938324.txt.gz · ostatnio zmienione: przez sindap
