Не удается отправить почтовый запрос с помощью HTMX + Django

Я пытаюсь создать CRUD-страницу с помощью django + HTMX и не могу отправить POST-запрос. hx-post посылает GET запрос вместо POST запроса.

Мои ролевые модели следующие:

class Role(models.Model):
    name = models.CharField(max_length=200)

Я создаю форму с помощью Cripsy Forms следующим образом

class RoleForm(forms.ModelForm):
    class Meta:
        model = Role

      fields = ('name', )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.fields['name'].label = "Role"

        self.helper.add_input(Submit('add_new_Role', 'Add', css_class='role_button'))
        self.helper.layout = Layout(
            Row(
                Column('name'),
            )
        )

Я использую форму в своем шаблоне следующим образом :

{% extends 'main.html' %}
{% load crispy_forms_tags %}

{% block content %}
<div class="row">
  <div class="card col-md-6 ml-auto mr-auto">
    <div class="card-body">
      {% crispy role_form %}
    </div>
  </div>
</div>
<div id="role_list">
  {% include 'role_list.html' %}
</div>


{% endblock %}


{% block javascript %}
<script type="text/javascript">
  $(document).ready(function(){
    $("form").removeAttr("method");
    $('.role_button').attr("hx-post", '{% url "role_add" %}');
    $('.role_button').attr('hx-target', '#role_list');

  });
</script>

{% endblock %}

Ссылка CDN добавлена в файл main.html.

Насколько я понимаю, нажатие на кнопку ADD должно вызывать POST-запрос. Однако инициируется GET запрос, что заставляет меня чувствовать, что HTMX часть не работает вообще

Я нашел решение после слишком большого количества проб и ошибок. Оказывается, Django Crispy формы создают вход с type='submit' для создания кнопки submit

однако, hx-post работает только если у вас есть кнопка с type='submit' вместо input для отправки формы

Типичный способ сделать это - добавить атрибуты hx-post и ht-target к элементу form, а не к кнопке submit. Это заставит HTMX перехватить событие submit на форме и отправить всю форму в виде AJAX-запроса.

См. документацию Triggering Requests:

По умолчанию запросы AJAX запускаются "естественным" событием элемента элемента:

  • форма срабатывает на событие submit

Как сказал @Mark в своем ответе, я бы предложил определить тег формы в вашем шаблоне и поместить htmx материал на него:

<form hx-post={% url 'submit url' %}  <!-- Do not set action and method -->
 ...other htmx attributes>
    {% crispy form %}    
</form>

и установите помощник формы в положение не отображать тег формы

self.helper.form_tag = False

И кстати, если вы настроили htmx на автоматическую отправку csrf, (Смотрите здесь для дополнительной информации) лучше отключить csrf в вашем помощнике формы также

self.helper.disable_csrf = True  # no need, request is sent via htmx
Вернуться на верх