我要做的主要事情是使用特定的自定义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>
...
答案 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
。