如何在 Django 的一页上有 2 Models/Views/Templates?

How to have 2 Models/Views/Templates on one Page in Django?

我知道这可能已被问过 1000 次,但我终究还是找不到合适的答案。阅读教程、Stack,甚至查看 GitHub 中的示例 - 没有任何帮助甚至引导我朝着正确的方向前进。

我有 2 个独立的 Models/Views/Templates,每个都可以独立工作 URLS.

我希望这些 Models/Views/Templates 在单个 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 个参数,当我将 table 放在 '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 的新手。

(*为坦率道歉 - 这真的开始让我上墙)

您还没有说出您为解决此问题所做的努力,为什么您认为它是 "way overly complicated",或者为什么它让您感到沮丧。

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

但要了解的另一件事是模板和模型以任何方式连接到任何特定视图。一个视图可以渲染任意数量的模板,一个,多个,甚至none;并且这些模板中的任何一个都可以涉及来自任意数量应用程序的任意数量的模型。

因此,如果您想在主页中包含任务,一种方法是在视图的上下文字典中包含 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 是 table.html 还是 home.html?如果您在对 render 的调用中传递 "home.html",那么将呈现 home.html,而不是 table。如果你想渲染 table 以便它扩展到家,那么在你的渲染调用中传递 "table.html"。

我的代码最终看起来像

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)

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

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)

我遇到了类似的问题,我想用一个 url 在一个模板上显示两个不同的视图,所以我做了类似的事情,对我来说效果很好。