如何将多个视图函数中的上下文变量传递到同一模板

时间:2013-05-19 21:50:16

标签: django templates view

我有一个由多个视图功能提供服务的模板。例如,read_posts()视图返回带有GET的所有帖子,add_post()视图添加了一个带POST的新帖子。

我可能在同一页面上有其他帖子操作,需要更多视图功能。

现在,每个视图函数都需要将不同的参数传递给模板。例如。每个表单可能需要传递不同的表单参数。

从多个视图函数组织单个模板的多个参数的最佳实践是什么?

作为示例,posts.html是我使用的模板:

<html>
    <head>
      <title>My Django Blog</title>
    </head>
    <body>
        <form action="{% url 'blog:add_post' %}" method="post">
             {% csrf_token %}
             <p><input type="text" name="title" id="title" /></p>
             <p><input type="textarea" name="text" id="text" /></p>
             <input type="submit" value="Submit" />
        </form>
        {% for post in posts %}
        <h1>{{ post.title }}</h1>
        <h3>{{ post.pub_date }}</h3>
        {{ post.text }}
        {% endfor %} 
    </body>
</html>                      

以下是我使用的观点:

def display_posts(request):
    #All posts
    posts = Post.objects.all()
    sorted_posts = posts.order_by('-pub_date')
    context = { 'posts' : sorted_posts }
    return render(request, 'blog/posts.html', context)

def add_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        #return HttpResponse('Hello World')
        if form.is_valid():
            post = Post()
            post.title = form.cleaned_data['title']
            post.text = form.cleaned_data['text']
            post.pub_date = datetime.now()
            post.save()
            return HttpResponseRedirect(reverse('blog:display_posts'))
        else:
            form = PostForm() # An unbound form
    return render(request, "blog:display_posts")

正如您所看到的,display_posts()是请求页面时的默认GET,add_post()处理http POST时,创建新帖子时。

每个函数都处理页面的不同功能,它们需要传递给模板的不同上下文变量。 (注意我只使用了display_posts的上下文)

如何确保每个函数向页面发送不同的上下文,并在模板中正确组织它们?

当您在页面上处理多个表单时,是否为它们使用了部分模板,%将它们包含在主页面中?

感谢。

0 个答案:

没有答案