LightkingBeknazarov

Htmx Django

Mar 15th, 2022
1,125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.05 KB | None | 0 0
  1. #urls.py
  2. path("pillars/hajj-form/", create_pillars_hajj_form, name="pillars-hajj"),
  3. path('pillars/path/<int:pk>/detail/', pillars_detail, name="detail-pillars"),
  4. path('pillars/path/<int:pk>/delete/', delete_pillar, name="delete-pillars"),
  5. path('pillars/path/<int:pk>/update/', update_pillar, name="update-pillars"),
  6. path('pillars/create/', create_pillar, name='pillars-creates'),
  7.  
  8. #views.py
  9. def create_pillars_hajj_form(request):
  10.     pillars_form = PillarsHajjForm(request.POST, request.FILES)
  11.     context = {
  12.         "form": pillars_form
  13.     }
  14.     return render(request, "pillars/pillars-form.html", context)
  15.  
  16. def create_pillar(request):
  17.     pillars = PillarsHajj.objects.all()
  18.  
  19.     if request.method == "POST":
  20.         form = PillarsHajjForm(request.POST, request.FILES)
  21.         if form.is_valid():
  22.             pillar_instance = form.save(commit=False)
  23.             pillar_instance.save()
  24.             return redirect("detail-pillars", pk=pillar_instance.id)
  25.         else:
  26.             return render(request, "pillars/pillars-form.html", context={
  27.                 "form": form
  28.             })
  29.     else:
  30.         form = PillarsHajjForm()
  31.     context = {
  32.         "form": form,
  33.         "pillars": pillars,
  34.         "navbar": "pillars",
  35.     }
  36.     return render(request, "pillars/pillars.html", context)
  37.  
  38.  
  39. def pillars_detail(request, pk):
  40.     try:
  41.         pillar = PillarsHajj.objects.get(id=pk)
  42.     except PillarsHajj.DoesNotExist:
  43.         raise Http404
  44.     context = {
  45.         "pillar": pillar
  46.     }
  47.     return render(request, "uadmin/admin/pillars/pillar-detail.html", context)
  48. def update_pillar(request, pk):
  49.     pillar = get_object_or_404(PillarsHajj, pk=pk)
  50.  
  51.     if request.method == "POST":
  52.         form = PillarsHajjForm(request.POST,request.FILES, instance=pillar)
  53.         if form.is_valid():
  54.                 form.save()
  55.                 return redirect("detail-pillars", pk=pillar.id)
  56.     else:
  57.         form = PillarsHajjForm()
  58.     context = {
  59.         "form": form,
  60.         "pillar": pillar,
  61.     }
  62.  
  63.     return render(request, "uadmin/admin/pillars/pillars-form.html", context)
  64.  
  65.  
  66. def delete_pillar(request, pk):
  67.     pillar = get_object_or_404(PillarsHajj, pk=pk)
  68.  
  69.     if request.method == "POST":
  70.         pillar.delete()
  71.         return HttpResponse("")
  72.  
  73.     return HttpResponseNotAllowed(
  74.         [
  75.             "POST",
  76.         ]
  77.     )
  78.  
  79.  
  80. #html
  81. #pillars-form.html
  82. <div hx-target="this" hx-swap="outerHTML" class="mt-3 py-3 px-3 bg-white shadow border border-gray-100">
  83.     <form method="POST" enctype="multipart/form-data" hx-encoding='multipart/form-data' >
  84.         {% csrf_token %}
  85.         <div class="form-row">
  86.             <div class="col-md-3">
  87.                 {{ form.title|as_crispy_field }}
  88.             </div>
  89.             <div class="col-md-3">
  90.                 {{ form.images|as_crispy_field }}
  91.             </div>
  92.             <div class="col-md-3">
  93.                 {{ form.description|as_crispy_field }}
  94.             </div>
  95.         </div>
  96.         {% if pillar %}
  97.             <button type="submit" hx-post="{% url 'update-pillars' pk=pillar.pk %}"
  98.                     class="btn btn-sm btn-success">
  99.                 Редактировать
  100.             </button>
  101.             <button hx-get="{% url 'detail-pillars' pk=pillar.pk %}" type="button"
  102.                     class="btn btn-sm btn-secondary">Отмена
  103.             </button>
  104.         {% else %}
  105.             <button type="submit" hx-post="."
  106.                     class="btn btn-sm btn-primary">
  107.                 Создать
  108.             </button>
  109.         {% endif %}
  110.     </form>
  111. </div>
  112.  
  113.  
  114.  
  115. #pillars.html
  116. {% extends 'base_admin.html' %}
  117. {% block content %}
  118.  
  119.     <script src="https://unpkg.com/[email protected]"></script>
  120.     <script>
  121.         document.body.addEventListener('htmx:configRequest', (event) => {
  122.             event.detail.headers['X-CSRFToken'] = '{{ csrf_token }}';
  123.         })
  124.     </script>
  125.     <div class="d-flex justify-content-md-between">
  126.         <button type="button" hx-get="{% url 'pillars-hajj' %}" hx-target="#pillars_forms"
  127.                 hx-swap="beforeend"
  128.                 class="btn btn-sm btn-primary">
  129.             Добавить форму
  130.         </button>
  131.  
  132.     </div>
  133.     <div id="pillars_forms"></div>
  134.  
  135.     <div class="border-t border-gray-100">
  136.         {% for pillar in pillars %}
  137.             {% include "pillars/pillar-detail.html" %}
  138.         {% endfor %}
  139.     </div>
  140.  
  141. {% endblock %}
  142.  
  143. #pillar-detail.html
  144.  
  145. <div hx-target="this" class="mt-3 py-3 px-3 bg-white shadow border border-gray-100">
  146.     <h4 class="text-lg leading-6 font-medium text-gray-900">
  147.         Путь: {{ pillar.title }} - {{ pillar.description|safe }}
  148.     </h4>
  149.     <div class="mt-2">
  150.         <button hx-get="{% url 'update-pillars' pk=pillar.pk %}" hx-swap="outerHTML"
  151.                 class="btn btn-sm btn-primary">Редактировать
  152.         </button>
  153.         <button hx-post="{% url 'delete-pillars' pk=pillar.pk %}" hx-swap="outerHTML swap:1s"
  154.                 class="btn btn-sm btn-danger"> Удалить
  155.         </button>
  156.     </div>
  157. </div>
  158.  
  159.  
  160.  
Advertisement
Add Comment
Please, Sign In to add comment