我尝试使用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部分根本不起作用
4条答案
按热度按时间bgtovc5b1#
典型的方法是将
hx-post
和hx-target
属性添加到form
元素,而不是submit
按钮。这将导致HTMX拦截表单上的提交事件,并将整个表单作为AJAX请求提交。请参阅触发请求文档:
默认情况下,AJAX请求由元素的“自然”事件触发:
lf3rwulv2#
正如@Mark在他的回答中所说,我建议在你的模板上定义表单标签,并将
htmx
的东西放在上面:并将表单帮助器设置为不呈现表单标记
顺便说一句,如果你已经设置了htmx自动发送
csrf
,(更多信息请参见here)最好在你的表单助手中禁用csrf
mjqavswn3#
经过多次尝试和错误之后,我找到了解决办法。Django Crispy表单创建了一个输入
type='submit'
来创建提交按钮然而,hx-post只有在你有一个带有
type='submit'
的按钮而不是输入来提交表单时才能工作。gwbalxhn4#
@Mark在他的回答中说,这里是我以简洁的形式键入HTMX代码的方式。
在<button hx-get....htmx apache调用中键入代码不起作用。如果你想看到一些关于HTMX Pandas和Crispy一起工作的代码示例和教程,请在这里找到我自己的页面Htmx django-filter Pandas and Crispy form