如何在Django的一个页面上拥有2个模型/视图/模板?

时间:2015-05-20 14:43:01

标签: python django django-models django-templates django-views

我知道这可能已被问过1000次,但我仍然因为我的生活找不到合适的答案。阅读教程,Stack,甚至看GitHub的例子 - 没有什么能帮助甚至指导我朝着正确的方向发展。

我有2个单独的模型/视图/模板,每个模型/视图/模板都可以在自己的URL上运行得很漂亮。

我希望这些模型/视图/模板能够在单个URL上工作,即

url(r'^$', 'chrometask.views.index', name='home'),

(即我的主页。)

如何???对于这样一个简单的问题,这似乎过于复杂。

这是我的views.py

items = Task.objects.all()
form = TaskForm(request.POST or None)
task_list = Task.objects.order_by('priority')
context_dict = { 'Tasks' : task_list}

if form.is_valid():
    save_it = form.save(commit=False)
    save_it.save()
    return HttpResponseRedirect('') 

return render_to_response('home.html', #Don't know how to render 2 html files or add the context_dict
                          locals(),
                          context_instance=RequestContext(request))

render_to_resonse只能带3个参数,当我把表放在' home.html' {%blockquote%}它不会显示在页面上。

 <div class="collapsible-header"><i class="mdi-hardware-laptop-"></i>Title</a></div>
  <div class="collapsible-body">
  <div class="intro grey lighten-5">

    {% block content %}{% endblock %} <--This is the table.html, which extends fine with {% entends 'home.html' %}-->

</br>

  

请不要指导我阅读教程,这些问题无法解决问题,如果可能的话,我宁愿用外行的方式拼写出来,这可能有助于将答案深入到我的厚片中颅骨上。

注意 - 我是Django的新手。

(*坦率地道歉 - 这真的开始让我感到沮丧)

3 个答案:

答案 0 :(得分:0)

你还没有说过你试图解决这个问题,为什么你认为它“过于复杂”,或者为什么它会让你感到沮丧。

要理解的是,视图完全负责页面,即视图在请求URL时创建整个响应。您不能在URL上有两个视图;这根本没有意义。

但要理解的另一件事是模板和模型以任何方式连接到任何特定视图。一个视图可以呈现任意数量的模板,一个,多个,甚至没有;任何这些模板都可以涉及任意数量的应用程序中的任意数量的模型。

因此,如果您想在主页中包含任务,一种方法就是将Tasks包含在视图中的上下文词典中,并将相关代码包含在模板中以显示它们。

现在,如果您在多个视图中执行此操作,那么显然您希望将该代码放在合理的位置,以便您不要重复自己。理想的地方是inclusion tag:您可以将查询最新任务的代码以及呈现它们的模板片段包装成一个标签,然后您可以在主页模板上使用该标签。

修改

上下文是render_to_response的第二个参数:您当前放置locals()的位置。这是一个我讨厌的可怕模式,这让你不必要地困惑。而不是使用本地,将上下文所需的所有内容专门放入context_dict并将其传递给那里。

(另请注意,您应使用render快捷方式而不是render_to_response,它接受​​请求作为第一个参数,并且不需要使用RequestContext进行所有操作。)

context_dict = { 'Tasks' : task_list, 'form': form}
...
return render(request, 'home.html', context_dict)

您为模板发布的代码令人困惑。 table.html或home.html中的表格是?如果您在致电render时传递“home.html”,那么它将会呈现home.html,而不是表格。如果你想渲染表格以使其扩展回家,那么在你的调用中传递“table.html”以进行渲染。

答案 1 :(得分:0)

我的代码最终看起来像

def home(request):

items = Task.objects.all()
form = TaskForm(request.POST or None)
task_list = Task.objects.order_by('priority')

context_dict = { 'Tasks' : task_list, 'form': form}

if form.is_valid():
    save_it = form.save()
    save_it.save()
    return HttpResponseRedirect('')

return render(request, 'table.html', context_dict)

这两个模型都在一个视图中工作。

答案 2 :(得分:0)

def tutlist(request,tut):
    model = Tutorial
    model = Codetut
    template_name = 'backpages/tutorial.html'
    temp = Parts.objects.get(pk = tut)
    model = temp.tutorial_set.all()
    print(model)
    temp = Parts.objects.get(pk = tut)
    code = temp.codetut_set.all()
    print(code)
    context = {'model' : model ,'something': code}
    return render(request, template_name,context)

我遇到了类似的问题,我想在一个单独的网址上显示两个不同的视图,所以我做了类似这样的事情,对我来说效果很好。