sort_order不会从django脆皮形式的toogle排序按钮更改

发布于 2025-02-13 12:42:10 字数 2592 浏览 0 评论 0原文

我正在使用django脆皮表单,并且有一个托格尔排序按钮可以通过ascdesc订单排序。

一个searchform这样:

class SearchForm(forms.Form):
    """Text-searching form."""

    ...
    sort_order = forms.CharField(required=False, widget=forms.HiddenInput)
    ....

    def __init__(self, user, language=None, show_builder=True, **kwargs):
        """Generate choices for other components in the same project."""
        self.user = user
        self.language = language
        super().__init__(**kwargs)

        self.helper = FormHelper(self)
        self.helper.disable_csrf = True
        self.helper.form_tag = False
        self.helper.layout = Layout(
            Div(
                ....
                Div(
                    Field("sort_by", template="snippets/sort-field.html"),
                    Field("sort_order", template="snippets/sort-order.html"),
                    css_class="btn-group search-group sort-field",
                    role="group",
                ),
                css_class="btn-toolbar",
                role="toolbar",
            ),
            ....
        )

我有sort-header.html这样的:

<div class="btn-group sort-order" role="group">
    <button type="button" class="btn btn-default search-field query-sort-toggle">
        <span title="Ascending" class="search-icon active asc">{% icon "sort-ascending.svg" %}</span>
        <span title="Descending" class="search-icon desc">{% icon "sort-descending.svg" %}</span>
    </button>
    <input type="hidden" id="id_sort_order" name="sort_order" value="{{ sort_order|default:'asc' }}" aria-label="{% trans "Sort Order" %}" />
</div>

我有 Order 按钮:

$(".query-sort-toggle").click(function () {
    var $this = $(this);
    var $label = $this.find("span.search-icon");
    $label.toggle();

    var sort_order = $label.attr('class').replace('search-icon active', '')
    var $toggleInput = $this.closest(".sort-order").find("input[name=sort_order]");
    $toggleInput.val(sort_order)

    ....
    if ($this.closest(".result-page-form").length) {
      $this.closest("form").submit();
    }
  });

单击按钮时,此CSS隐藏了不活动的跨度:

.query-sort-toggle span:not(.active) {
  display: none;
}

我有此切换按钮,并在单击时提交表单。

默认排序顺序为asc订单,但是在表单提交后页面重新加载时,该按钮仍显示默认值。

我可以按ascdesc顺序排序,但是我无法更改span的图标和sort_order < /代码>变量。

我在这里缺少什么?

I am using django crispy forms and I have a toogle sort button to sort by asc or desc order.

I have a SearchForm like this:

class SearchForm(forms.Form):
    """Text-searching form."""

    ...
    sort_order = forms.CharField(required=False, widget=forms.HiddenInput)
    ....

    def __init__(self, user, language=None, show_builder=True, **kwargs):
        """Generate choices for other components in the same project."""
        self.user = user
        self.language = language
        super().__init__(**kwargs)

        self.helper = FormHelper(self)
        self.helper.disable_csrf = True
        self.helper.form_tag = False
        self.helper.layout = Layout(
            Div(
                ....
                Div(
                    Field("sort_by", template="snippets/sort-field.html"),
                    Field("sort_order", template="snippets/sort-order.html"),
                    css_class="btn-group search-group sort-field",
                    role="group",
                ),
                css_class="btn-toolbar",
                role="toolbar",
            ),
            ....
        )

I have the sort-header.html like this:

<div class="btn-group sort-order" role="group">
    <button type="button" class="btn btn-default search-field query-sort-toggle">
        <span title="Ascending" class="search-icon active asc">{% icon "sort-ascending.svg" %}</span>
        <span title="Descending" class="search-icon desc">{% icon "sort-descending.svg" %}</span>
    </button>
    <input type="hidden" id="id_sort_order" name="sort_order" value="{{ sort_order|default:'asc' }}" aria-label="{% trans "Sort Order" %}" />
</div>

and jquery for handling click event on sort order button:

$(".query-sort-toggle").click(function () {
    var $this = $(this);
    var $label = $this.find("span.search-icon");
    $label.toggle();

    var sort_order = $label.attr('class').replace('search-icon active', '')
    var $toggleInput = $this.closest(".sort-order").find("input[name=sort_order]");
    $toggleInput.val(sort_order)

    ....
    if ($this.closest(".result-page-form").length) {
      $this.closest("form").submit();
    }
  });

When the button is clicked, the inactive span gets hidden by this css:

.query-sort-toggle span:not(.active) {
  display: none;
}

I have this toggle button and form gets submitted on the click.

The default sort order is asc order but when page reloads after the form submittion, the button still shows the default value.

I am able to sort by asc and desc order but I am not able to change the icon of the span and the sort_order variable.

What I am missing here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一张白纸 2025-02-20 12:42:10

您可以在JavaScript中添加一些调试代码,并查看浏览器控制台,以查看是否将正确的值设置为您的表单。

$(".query-sort-toggle").click(function () {
    var $this = $(this);
    var $label = $this.find("span.search-icon");
    $label.toggle();

    var sort_order = $label.attr('class').replace('search-icon active', '')
    var $toggleInput = $this.closest(".sort-order").find("input[name=sort_order]");
    $toggleInput.val(sort_order)
    // DEBUG
    console.debug('set sort_order value');
    console.debug(sort_order);

    ....
    if ($this.closest(".result-page-form").length) {
      $this.closest("form").submit();
    }
  });

您甚至可以使用视图来验证提交的数据,

def your_view(request):
    print(request.POST.get('sort_order')
    # ... your code
    context['sort_order] = sort_order
    return render(request, 'template/name.html', context)

如果您确保提交正确的值,则可以调整模板以显示所选排序订单图标

<div class="btn-group sort-order" role="group">
    <button type="button" class="btn btn-default search-field query-sort-toggle">
        <span title="Ascending" class="search-icon {% if sort_order == 'asc' %}active{% endif %} asc">{% icon "sort-ascending.svg" %}</span>
        <span title="Descending" class="search-icon {% if sort_order == 'desc' %}active{% endif %} desc">{% icon "sort-descending.svg" %}</span>
    </button>
    <input type="hidden" id="id_sort_order" name="sort_order" value="{{ sort_order|default:'asc' }}" aria-label="{% trans "Sort Order" %}" />
</div>

You could add some debug code to your JavaScript and look at the browser console to see if the right value is set to your form.

$(".query-sort-toggle").click(function () {
    var $this = $(this);
    var $label = $this.find("span.search-icon");
    $label.toggle();

    var sort_order = $label.attr('class').replace('search-icon active', '')
    var $toggleInput = $this.closest(".sort-order").find("input[name=sort_order]");
    $toggleInput.val(sort_order)
    // DEBUG
    console.debug('set sort_order value');
    console.debug(sort_order);

    ....
    if ($this.closest(".result-page-form").length) {
      $this.closest("form").submit();
    }
  });

You could even use your view to verify the submitted data

def your_view(request):
    print(request.POST.get('sort_order')
    # ... your code
    context['sort_order] = sort_order
    return render(request, 'template/name.html', context)

If you made sure the right value is submitted, you can adjust the template to show the selected sort order icon

<div class="btn-group sort-order" role="group">
    <button type="button" class="btn btn-default search-field query-sort-toggle">
        <span title="Ascending" class="search-icon {% if sort_order == 'asc' %}active{% endif %} asc">{% icon "sort-ascending.svg" %}</span>
        <span title="Descending" class="search-icon {% if sort_order == 'desc' %}active{% endif %} desc">{% icon "sort-descending.svg" %}</span>
    </button>
    <input type="hidden" id="id_sort_order" name="sort_order" value="{{ sort_order|default:'asc' }}" aria-label="{% trans "Sort Order" %}" />
</div>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文