bulk_edit.html 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. {% extends 'base/layout.html' %}
  2. {% load helpers %}
  3. {% load form_helpers %}
  4. {% load render_table from django_tables2 %}
  5. {% comment %}
  6. Context:
  7. model: The model class of the objects being modified
  8. form: The bulk edit form class
  9. table: The table class for rendering list of objects being modified
  10. return_url: The URL to which the user is redirected after submitting the form
  11. {% endcomment %}
  12. {% block title %}Editing {{ table.rows|length }} {{ model|meta:"verbose_name_plural"|bettertitle }}{% endblock %}
  13. {% block tabs %}
  14. <ul class="nav nav-tabs px-3">
  15. <li class="nav-item" role="presentation">
  16. <button class="nav-link active" id="edit-form-tab" data-bs-toggle="tab" data-bs-target="#edit-form" type="button" role="tab" aria-controls="edit-form" aria-selected="true">
  17. Bulk Edit
  18. </button>
  19. </li>
  20. <li class="nav-item" role="presentation">
  21. <button class="nav-link" id="object-list-tab" data-bs-toggle="tab" data-bs-target="#object-list" type="button" role="tab" aria-controls="object-list" aria-selected="false">
  22. Selected Objects
  23. {% badge table.rows|length %}
  24. </button>
  25. </li>
  26. </ul>
  27. {% endblock tabs %}
  28. {% block content-wrapper %}
  29. <div class="tab-content">
  30. {% block content %}
  31. {# Edit form #}
  32. <div class="tab-pane show active" id="edit-form" role="tabpanel" aria-labelledby="edit-form-tab">
  33. <form action="" method="post" class="form form-horizontal">
  34. {% csrf_token %}
  35. {% if request.POST.return_url %}
  36. <input type="hidden" name="return_url" value="{{ request.POST.return_url }}" />
  37. {% endif %}
  38. {% for field in form.hidden_fields %}
  39. {{ field }}
  40. {% endfor %}
  41. <div class="row">
  42. <div class="col col-md-12 col-lg-10 offset-lg-1">
  43. <div class="card">
  44. <div class="card-body">
  45. {% if form.fieldsets %}
  46. {# Render grouped fields according to declared fieldsets #}
  47. {% for group, fields in form.fieldsets %}
  48. <div class="field-group mb-5">
  49. <div class="row mb-2">
  50. <h5 class="offset-sm-3">
  51. {% if group %}{{ group }}{% else %}{{ model|meta:"verbose_name"|bettertitle }}{% endif %}
  52. </h5>
  53. </div>
  54. {% for name in fields %}
  55. {% with field=form|getfield:name %}
  56. {% if field.name in form.nullable_fields %}
  57. {% render_field field bulk_nullable=True %}
  58. {% else %}
  59. {% render_field field %}
  60. {% endif %}
  61. {% endwith %}
  62. {% endfor %}
  63. </div>
  64. {% endfor %}
  65. {# Render tag add/remove fields #}
  66. {% if form.add_tags and form.remove_tags %}
  67. <div class="field-group mb-5">
  68. <div class="row mb-2">
  69. <h5 class="offset-sm-3">Tags</h5>
  70. </div>
  71. {% render_field form.add_tags %}
  72. {% render_field form.remove_tags %}
  73. </div>
  74. {% endif %}
  75. {# Render custom fields #}
  76. {% if form.custom_fields %}
  77. <div class="field-group mb-5">
  78. <div class="row mb-2">
  79. <h5 class="offset-sm-3">Custom Fields</h5>
  80. </div>
  81. {% render_custom_fields form %}
  82. </div>
  83. {% endif %}
  84. {# Render comments #}
  85. {% if form.comments %}
  86. <div class="field-group mb-5">
  87. <div class="row mb-2">
  88. <h5 class="offset-sm-3">Comments</h5>
  89. </div>
  90. {% render_field form.comments bulk_nullable=True %}
  91. </div>
  92. {% endif %}
  93. {% else %}
  94. {# Render all fields #}
  95. {% for field in form.visible_fields %}
  96. {% if field.name in form.nullable_fields %}
  97. {% render_field field bulk_nullable=True %}
  98. {% else %}
  99. {% render_field field %}
  100. {% endif %}
  101. {% endfor %}
  102. {% endif %}
  103. </div>
  104. </div>
  105. <div class="text-end">
  106. <button type="submit" name="_apply" class="btn btn-sm btn-primary">Apply</button>
  107. <a href="{{ return_url }}" class="btn btn-sm btn-outline-danger">Cancel</a>
  108. </div>
  109. </div>
  110. </div>
  111. </form>
  112. </div>
  113. {# Selected objects list #}
  114. <div class="tab-pane" id="object-list" role="tabpanel" aria-labelledby="object-list-tab">
  115. <div class="card">
  116. <div class="card-body table-responsive">
  117. {% render_table table 'inc/table.html' %}
  118. </div>
  119. </div>
  120. </div>
  121. {% endblock content %}
  122. </div>
  123. {% endblock content-wrapper %}