【问题标题】:How to send variables from X-DATA to the server. Alpine JS & HTMX & Django?如何将变量从 X-DATA 发送到服务器。高山 JS & HTMX & Django?
【发布时间】:2022-02-15 21:57:45
【问题描述】:

我有下一个sn-p。有几个 select 块。我想做的是收集这两个变量并发送到 Django 服务器。但是 request.GET 是空的。怎么了?

<div class="flex" x-data="{ foo: '',  bar: ''}">
  <div class="flex justify-between">
    <div class="mt-1">

      <select x-model="foo"
              name="foo"
              id="foo"
              class="w-64 h-14 text-sm border-gray-300 focus:bg-transparent">
        <option value="">Type of FOO</option>
        <option value="FOO_1">FOO_1</option>
        <option value="FOO_2">FOO_2</option>
        <option value="FOO_1">FOO_3</option>
      </select>
    </div>

    <div class="mt-1">
      <select name="bar"
              x-model="bar"
              id="bar"
              class="w-64 h-14 text-sm border-gray-300 focus:bg-transparent">
        <option value="">BAR Types</option>
        <option value="BAR_1">BAR_1</option>
        <option value="BAR_2">BAR_2</option>
        <option value="BAR_3">BAR_3</option>
      </select>
    </div>


    <input type="text" name="foo" x-model="foo" hidden />
    <input type="text" name="bar" x-model="bar" hidden />

    <button
      hx-get="{% url 'server:parse-values' %}"
      hx-target="#element"
      hx-swap="innerHTML"
      hx-include="[name='foo', name='bar']">
    <span
      class="cursor-pointer px-3 py-3 border-2">Parse details</span>
    </button>
  </div>

</div>

但是当我点击按钮时,Django 后端没有收到 foobar 参数。

有什么想法吗?

【问题讨论】:

    标签: django django-templates alpine.js htmx


    【解决方案1】:

    要包含多个输入,您需要用逗号分隔它们:

    hx-include="input[name='foo'], input[name='bar']"
    

    这相当于使用 querySelectorAll 来获取您的输入:

    document.querySelectorAll("input[name='foo'], input[name='bar']")
    

    我添加了额外的input,因此它排除了选择列表,但您可能会从示例中删除隐藏的输入并仅包含列表。

    我还应该补充一点,如果您将 htmx 属性从按钮移动到 x-data div 并将其更改为表单。然后将按钮更改为键入submit。所有的表单数据都会自动发送到服务器。

    <form class="flex" x-data="{ foo: '',  bar: ''}" 
            hx-get="{% url 'server:parse-values' %}"
            hx-target="#element"
            hx-swap="innerHTML"
        >
            <div class="flex justify-between">
                <div class="mt-1">
    
                <select x-model="foo"
                        name="foo"
                        id="foo"
                        class="w-64 h-14 text-sm border-gray-300 focus:bg-transparent">
                    <option value="">Type of FOO</option>
                    <option value="FOO_1">FOO_1</option>
                    <option value="FOO_2">FOO_2</option>
                    <option value="FOO_1">FOO_3</option>
                </select>
                </div>
    
                <div class="mt-1">
                <select name="bar"
                        x-model="bar"
                        id="bar"
                        class="w-64 h-14 text-sm border-gray-300 focus:bg-transparent">
                    <option value="">BAR Types</option>
                    <option value="BAR_1">BAR_1</option>
                    <option value="BAR_2">BAR_2</option>
                    <option value="BAR_3">BAR_3</option>
                </select>
            </div>
    
            <button type="submit">
                <span class="cursor-pointer px-3 py-3 border-2">Parse details</span>
            </button>
    </form>
    

    【讨论】:

    • 感谢您的回复,但对我没有帮助。似乎 foobar 根本没有发送到服务器。
    • 我测试了代码,它在我的最终工作。您在向服务器发出的请求中看到的有效负载是什么?
    • 你可以看到它在这个jsfiddle中工作jsfiddle.net/bhnf4wxr打开浏览器开发工具检查请求,你可以看到参数包含在screencast.com/t/DfuCnAhmCwZ
    • 非常感谢!你是一个不可思议的人!终于找到错误的地方了。
    • 很高兴为您提供帮助。那么错在哪里呢?
    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 2013-09-26
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多