如何在Django中设置两个应用程序之间的通信?
我目前正试图用Django构建一个web应用程序Todo task manager,因为我发现最好的学习方法是把手弄脏,但我遇到了一个问题,我不知道Django的方法是什么 目前,我的项目中有两个应用程序,一个是“列表”,另一个是“任务”,我的问题是,在前端,我需要显示不同的列表,并将它们与每个列表相关的任务关联起来。到目前为止,我已经通过使用外键为我的任务提供一个列表id并将“任务”模型导入到“lists”views.py中,然后在list应用程序的views.py中查询任务,从而在前端实现了任务的可视化,但我觉得我现在正在制作一个frankeistein应用程序,因为它们都是相互依存 你们怎么处理这种情况 ps:这里是我的上下文代码摘录如何在Django中设置两个应用程序之间的通信?,django,django-models,django-views,Django,Django Models,Django Views,我目前正试图用Django构建一个web应用程序Todo task manager,因为我发现最好的学习方法是把手弄脏,但我遇到了一个问题,我不知道Django的方法是什么 目前,我的项目中有两个应用程序,一个是“列表”,另一个是“任务”,我的问题是,在前端,我需要显示不同的列表,并将它们与每个列表相关的任务关联起来。到目前为止,我已经通过使用外键为我的任务提供一个列表id并将“任务”模型导入到“lists”views.py中,然后在list应用程序的views.py中查询任务,从而在前端实现了
from tasks.models import Task
def lists_view(request):
lists = List.objects.all()
tasks = Task.objects.all()
print("The request: ", request)
context = {
'lists': lists,
'tasks': tasks,
}
for list in lists:
print("List: ", list)
return render(request, 'lists/lists.html', context)
def list_view(request, pk):
list = List.objects.get(id=pk)
tasks = Task.objects.all()
print(request)
context = {
'list': list,
'tasks': tasks,
}
return render(request, 'lists/list.html', context)
以及html:
{% for list in lists %}
<h1><a href="{% url 'list-detail' list.id %}">{{ list.title|title }}</a></h1>
<ul>
{% for task in tasks %}
{% if task.list.id == list.id%}
<li><a href="{% url 'task-detail' task.id %}">{{ task.title|capfirst }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% endfor %}
{%用于列表中的列表%}
{tasks%%中任务的%s}
{%if task.list.id==list.id%}
{%endif%}
{%endfor%}
{%endfor%}
首先,你真的需要两个独立的应用程序吗?列表中是否会包含任务以外的内容,这些内容差异很大,您需要将它们分开?您可以在单个应用程序中将列表和任务放在同一个modely.py中
第二,在这种情况下,你会有一些相互联系。没关系。不是每件事都需要分开和独立
现在,你的模特长什么样
如果列表中有许多任务,您应该有您提到的ForeignKey。类似这样的内容(简化):
现在,您可以简化视图:
from .models import List
def lists_view(request):
lists = List.objects.all()
context = {
'lists': lists,
}
return render(request, 'lists/lists.html', context)
def list_view(request, pk):
list = List.objects.get(id=pk)
context = {
'list': list,
}
return render(request, 'lists/list.html', context)
注意:应该使用prefetch_related()优化上面的查询集,以减少对db的调用数量
所以
及
您可以在模板中执行以下操作:
{% for list in lists %}
<h1><a href="{% url 'list-detail' list.id %}">{{ list.title|title }}</a></h1>
<ul>
{% for task in list.tasks %}
<li><a href="{% url 'task-detail' task.id %}">{{ task.title|capfirst }}</a></li>
{% endfor %}
</ul>
{% endfor %}
{%用于列表中的列表%}
{list.tasks%中的任务为%s}
{%endfor%}
{%endfor%}
首先,你真的需要两个独立的应用程序吗?列表中是否会包含任务以外的内容,这些内容差异很大,您需要将它们分开?您可以在单个应用程序中将列表和任务放在同一个modely.py中
第二,在这种情况下,你会有一些相互联系。没关系。不是每件事都需要分开和独立
现在,你的模特长什么样
如果列表中有许多任务,您应该有您提到的ForeignKey。类似这样的内容(简化):
现在,您可以简化视图:
from .models import List
def lists_view(request):
lists = List.objects.all()
context = {
'lists': lists,
}
return render(request, 'lists/lists.html', context)
def list_view(request, pk):
list = List.objects.get(id=pk)
context = {
'list': list,
}
return render(request, 'lists/list.html', context)
注意:应该使用prefetch_related()优化上面的查询集,以减少对db的调用数量
所以
及
您可以在模板中执行以下操作:
{% for list in lists %}
<h1><a href="{% url 'list-detail' list.id %}">{{ list.title|title }}</a></h1>
<ul>
{% for task in list.tasks %}
<li><a href="{% url 'task-detail' task.id %}">{{ task.title|capfirst }}</a></li>
{% endfor %}
</ul>
{% endfor %}
{%用于列表中的列表%}
{list.tasks%中的任务为%s}
{%endfor%}
{%endfor%}
关于这两个应用程序,是的,我的想法是一样的,我想我应该把它们都放在一个应用程序中,因为将它们分开越来越没有意义。现在对于模型来说,它们看起来很像你已经写过的,所以我很高兴我做对了;)对于queryset,我甚至不知道它的存在,它使事情比我设置的要容易得多,你是如何发现这些事情的?我的意思是文档太长了,你不可能全部读完吗?哈哈,不管怎样,谢谢你的回答,非常有帮助!老实说,只是随着时间的推移读了很多书。您应该偶尔翻阅django文档,尤其是当您试图实现一些不熟悉的东西时。例如,这个页面看起来很长,但读起来很快(),它将极大地帮助您构建查询。我还喜欢阅读StackOverflow最近的答案,特别是Daniel Roseman()等用户的答案。有很多很好的教程。只要阅读和练习,你就会达到目的!关于这两个应用程序,是的,我的想法是一样的,我想我应该把它们都放在一个应用程序中,因为把它们分开越来越没有意义。现在对于模型来说,它们看起来很像你已经写过的,所以我很高兴我做对了;)对于queryset,我甚至不知道它的存在,它使事情比我设置的要容易得多,你是如何发现这些事情的?我的意思是文档太长了,你不可能全部读完吗?哈哈,不管怎样,谢谢你的回答,非常有帮助!老实说,只是随着时间的推移读了很多书。您应该偶尔翻阅django文档,尤其是当您试图实现一些不熟悉的东西时。例如,这个页面看起来很长,但读起来很快(),它将极大地帮助您构建查询。我还喜欢阅读StackOverflow最近的答案,特别是Daniel Roseman()等用户的答案。有很多很好的教程。只要阅读和练习,你就会达到目的!
{% for list in lists %}
<h1><a href="{% url 'list-detail' list.id %}">{{ list.title|title }}</a></h1>
<ul>
{% for task in list.tasks %}
<li><a href="{% url 'task-detail' task.id %}">{{ task.title|capfirst }}</a></li>
{% endfor %}
</ul>
{% endfor %}