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



我需要做的主要事情是使用特定的自定义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)

因此,看起来不可能通过 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>
...

使用 GET 提交表单时,表单参数将作为查询组件追加到 URL 中,如示例中所示,?diff_ver=4.这些查询组件不是URL 路径组件的一部分,因此 Django URL 模式解析不会考虑这些组件

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

最新更新