【发布时间】: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>
...
【问题讨论】: