Няма описание

datacrud_list.html 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. {% extends "base.html" %}
  2. {% load legacy_filters %}
  3. {% load tailwind_filters %}
  4. {% block title %}{{ page_title }}{% endblock %}
  5. {% block content %}
  6. <div class="container mx-auto px-4 py-6">
  7. <h1 class="text-3xl font-bold text-gray-800 mb-4">{{ page_title }}</h1>
  8. <!-- Filter Form -->
  9. <form method="get" class="flex items-center space-x-4 mb-4">
  10. {{ filter.form | crispy }}
  11. <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">Filter</button>
  12. <a href="?" class="bg-gray-300 text-gray-800 px-4 py-2 rounded hover:bg-gray-400">Reset</a>
  13. </form>
  14. <!-- Create Button -->
  15. <div class="my-4 flex">
  16. <p class="text-gray-600 mb-4 mr-auto">
  17. Total Records: {{ page_obj.paginator.count }}
  18. </p>
  19. <a href="{% url create_url %}" class="ml-auto bg-green-500 text-white px-4 py-2 rounded hover:bg-green-600">
  20. Create New Data
  21. </a>
  22. </div>
  23. <!-- Data Table -->
  24. <div class="clear-both bg-white shadow rounded-lg overflow-x-auto">
  25. <table class="w-full border-collapse border border-gray-200">
  26. <thead>
  27. <tr class="bg-gray-100 text-left text-sm uppercase">
  28. {% for field in fields %}
  29. <th class="border border-gray-200 px-4 py-2 text-left">{{ field.verbose_name }}</th>
  30. {% endfor %}
  31. <th class="py-2 px-4 border-b">Actions</th>
  32. </tr>
  33. </thead>
  34. <tbody>
  35. {% for obj in page_obj %}
  36. <tr class="hover:bg-gray-50">
  37. {% for field in fields %}
  38. <td class="border border-gray-200 px-4 py-2">
  39. {% if field.name == 'id' %}
  40. <a href="{% url update_url obj.pk %}" class="text-blue-500 hover:underline">
  41. {{ obj|attr:field.name }}
  42. </a>
  43. {% elif field.name == 'file' and obj.file %}
  44. <a href="{{ obj.file.url }}" target="_blank">View</a>
  45. {% else %}
  46. {{ obj|attr:field.name }}
  47. {% endif %}
  48. </td>
  49. {% endfor %}
  50. <td class="py-2 px-4 border-b">
  51. <a href="{% url update_url obj.pk %}"
  52. class="bg-blue-500 text-white px-3 py-2 rounded hover:bg-blue-600">Edit</a>
  53. <a href="{% url delete_url obj.pk %}"
  54. class="bg-red-500 text-white px-3 py-2 rounded hover:bg-red-600">Delete</a>
  55. </td>
  56. </tr>
  57. {% empty %}
  58. <tr>
  59. <td colspan="5" class="py-4 px-4 text-center text-gray-600">No data available.</td>
  60. </tr>
  61. {% endfor %}
  62. </tbody>
  63. </table>
  64. </div>
  65. <!-- Pagination -->
  66. <div class="mt-6 flex justify-between items-center">
  67. <div>
  68. <span class="text-sm text-gray-600">
  69. Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
  70. </span>
  71. </div>
  72. <div class="space-x-2">
  73. {% if page_obj.has_previous %}
  74. <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page=1"
  75. class="text-blue-500 hover:underline">First</a>
  76. <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_obj.previous_page_number }}"
  77. class="text-blue-500 hover:underline">Previous</a>
  78. {% endif %}
  79. {% if page_obj.has_next %}
  80. <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_obj.next_page_number }}"
  81. class="text-blue-500 hover:underline">Next</a>
  82. <a href="?{% for key, value in request.GET.items %}{% if key != 'page' %}{{ key }}={{ value|urlencode }}&{% endif %}{% endfor %}page={{ page_obj.paginator.num_pages }}"
  83. class="text-blue-500 hover:underline">Last</a>
  84. {% endif %}
  85. </div>
  86. </div>
  87. </div>
  88. <style>
  89. /* Remove fixed layout and allow columns to grow dynamically */
  90. table {
  91. table-layout: auto; /* Default is auto, can be explicitly set */
  92. width: 100%; /* Ensures table spans available space */
  93. }
  94. th, td {
  95. white-space: nowrap; /* Prevents text wrapping */
  96. text-overflow: ellipsis; /* Adds ellipsis for overflowed content if combined with max-width */
  97. vertical-align: top; /* Aligns content to the top */
  98. }
  99. </style>
  100. {% endblock %}