【问题标题】:How to pass a custom tag parameter from a form field?如何从表单字段传递自定义标签参数?
【发布时间】:2019-09-02 21:39:15
【问题描述】:

我需要做的主要事情是使用特定的自定义 python 函数扩展模型 DetailView 页面。该函数需要从DetailView 页面调用并返回一些数据,具体取决于用户在DetailView 上的自定义表单中输入的参数。该数据由自定义函数响应,当用户输入表单字段值并按“提交”时,我需要显示在相同的DetailView 页面上,没有数据库记录。我想通过自定义标签来实现该功能,该标签位于/app/templatetags/func.py

#/app/templatetags/func.py

from django import template
register = template.Library()

def get_data(current_version, previous_version, some_data):
    return current_version+' works!'

并在模板中调用它,类似这样:

<!--templates/detail/article_detail.html-->

{% load func %}
...
{% get_data article_object.value %}

<form action="" method="get">
    {{ form }}
    <input type="submit" value="Compare">
</form>
...

然后我尝试在模板中指定一个参数。 但我无法理解如何从表格中获取它。这里是views.py

class ArticleDetailView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
    model = Article
    context_object_name = 'article_object'
    template_name = 'detail/article_detail.html'
    login_url = 'login'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['form'] = GetChangelog()
        return context

forms.py

class GetChangelog(forms.Form):
    diff_version = forms.CharField(label='difference',max_length=10)

由于that,似乎无法通过网址传递参数。假设我的文章详情查看页面有一个 url: http://blog.com/articles/4 ;当我将一些数据放入表单并按submit 时,它变为http://blog.com/articles/4?diff_ver=4,但我发现自己在同一页面上,而在网址中我指出了该记录:

#urls.py

...

path('articles/<int:pk>?diff_ver=<str:diff_ver>', ArticleDetailView.as_view(), name='article_changelog')

根据我的想法,当 url 更改为 http://blog.com/articles/4?diff_ver=4 时,它必须将我重定向到另一个视图,其中包含来自 func.py 的自定义函数的一些附加数据,它将接收 diff_ver 作为参数。或者这里可以接受其他一些方法吗?

更新 感谢@dirkgroten,它可以通过上下文轻松完成:

class ArticleDetailView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
    model = Article
    context_object_name = 'article_object'
    template_name = 'detail/article_detail.html'
    login_url = 'login'

    def get_context_data(self, **kwargs):
        context['parameter'] = self.request.GET.get('diff_version')
        context = super().get_context_data(**kwargs)
        context['form'] = GetChangelog()
        return context

在模板中:

<!--templates/detail/article_detail.html-->

{% load func %}
...
{% get_data parameter %}

<form action="" method="get">
    {{ form }}
    {{ parameter }}
    <input type="submit" value="Compare">
</form>
...

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    当您使用 GET 提交表单时,表单参数将作为 query components 附加到 URL,如示例中所示 ?diff_ver=4。这些查询组件不是 URL 的path component 的一部分,因此不会被 Django URL 模式解析考虑在内。

    但就像POST 请求一样,您可以使用request.POST 获取提交的参数,它们是您视图中request.GET 字典的一部分。所以request.GET.get('diff_ver') 将返回提交的值,如果没有提交,则返回None

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 2011-06-17
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      相关资源
      最近更新 更多