如何从表单字段传递自定义标签参数?

时间:2019-09-02 21:39:15

标签: django django-templates

我要做的主要事情是使用特定的自定义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传递参数。想象一下,我的文章详细信息视图页面具有一个URL: http://blog.com/articles/4;当我将一些数据放入表单并按submit时,它变成http://blog.com/articles/4?diff_ver=4,但是我发现自己在同一页上,而在url中我已指向该记录:

#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>
...

1 个答案:

答案 0 :(得分:1)

使用GET提交表单时,表单参数将以query components的形式附加到URL,如示例?diff_ver=4所示。这些查询组件不是URL path component的组成部分,因此Django URL模式解析未将它们考虑在内。

但是与POST请求一样,您可以在其中使用request.POST获取提交的参数,它们是视图中request.GET词典的一部分。因此,request.GET.get('diff_ver')将返回所提交的值;如果未提交任何内容,则将返回None

相关问题