from typing import Any, Optional from django.core.exceptions import ValidationError from django.core.handlers.wsgi import WSGIRequest from django.http import Http404, HttpResponse from django.shortcuts import render from project.main.models import Person from project.main.views.demo_view_base import DemoViewBase def get_person(pk: int) -> Person: try: return Person.objects.get(pk=pk) except Person.DoesNotExist: raise Http404("Person not found") class TableInlineEditView(DemoViewBase): template_name = "main/table_inline_edit.html" active_section = "table-inline-edit" title = "Table Inline Edit" def get_context_data(self, **kwargs) -> dict[str, Any]: context_data = super().get_context_data(**kwargs) persons = Person.objects.all() context_data.update( { "persons": persons, } ) return context_data class TableInlineEditRowView(DemoViewBase): template_name = "main/table_inline_table_row.html" def get_context_data(self, **kwargs) -> dict[str, Any]: context_data = super().get_context_data(**kwargs) person = get_person(pk=kwargs.get("pk")) action = self.request.GET.get("action", "edit") context_data.update( { "person": person, "is_editing": action == "edit", } ) return context_data def post(self, request: WSGIRequest, *args, **kwargs) -> HttpResponse: errors: Optional[dict[str, str]] = None person = get_person(pk=kwargs.get("pk")) person.name = request.POST.get("name") person.address = request.POST.get("address") person.city = request.POST.get("city") try: person.clean_fields() except ValidationError as ex: errors = {key: value[0].message for key, value in ex.error_dict.items()} else: person.save() print(errors) return render( context={ "person": person, "errors": errors, "is_editing": errors is not None, }, template_name=self.template_name, request=request, )