无法使用HTMX + Django发送post请求

tf7tbtn2  于 2023-10-21  发布在  Go
关注(0)|答案(4)|浏览(154)

我尝试使用django + HTMX创建CRUD页面,但无法发送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部分根本不起作用

bgtovc5b

bgtovc5b1#

典型的方法是将hx-posthx-target属性添加到form元素,而不是submit按钮。这将导致HTMX拦截表单上的提交事件,并将整个表单作为AJAX请求提交。
请参阅触发请求文档:
默认情况下,AJAX请求由元素的“自然”事件触发:

  • 提交事件触发表单
lf3rwulv

lf3rwulv2#

正如@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,(更多信息请参见here)最好在你的表单助手中禁用csrf

self.helper.disable_csrf = True  # no need, request is sent via htmx
mjqavswn

mjqavswn3#

经过多次尝试和错误之后,我找到了解决办法。Django Crispy表单创建了一个输入type='submit'来创建提交按钮
然而,hx-post只有在你有一个带有type='submit'的按钮而不是输入来提交表单时才能工作。

gwbalxhn

gwbalxhn4#

@Mark在他的回答中说,这里是我以简洁的形式键入HTMX代码的方式。

<form class="form-inline" 
            hx-get = "{% url 'myurl' %}"
            hx-target="#myinclude"
            >
                 {{  form|crispy }}
              <button type="submit"  class="btn btn-success" 
              >Search</button>
            </form>

在<button hx-get....htmx apache调用中键入代码不起作用。如果你想看到一些关于HTMX Pandas和Crispy一起工作的代码示例和教程,请在这里找到我自己的页面Htmx django-filter Pandas and Crispy form

相关问题