如何在Django中设置两个应用程序之间的通信?

如何在Django中设置两个应用程序之间的通信?,django,django-models,django-views,Django,Django Models,Django Views,我目前正试图用Django构建一个web应用程序Todo task manager,因为我发现最好的学习方法是把手弄脏,但我遇到了一个问题,我不知道Django的方法是什么 目前,我的项目中有两个应用程序,一个是“列表”,另一个是“任务”,我的问题是,在前端,我需要显示不同的列表,并将它们与每个列表相关的任务关联起来。到目前为止,我已经通过使用外键为我的任务提供一个列表id并将“任务”模型导入到“lists”views.py中,然后在list应用程序的views.py中查询任务,从而在前端实现了

我目前正试图用Django构建一个web应用程序Todo task manager,因为我发现最好的学习方法是把手弄脏,但我遇到了一个问题,我不知道Django的方法是什么

目前,我的项目中有两个应用程序,一个是“列表”,另一个是“任务”,我的问题是,在前端,我需要显示不同的列表,并将它们与每个列表相关的任务关联起来。到目前为止,我已经通过使用外键为我的任务提供一个列表id并将“任务”模型导入到“lists”views.py中,然后在list应用程序的views.py中查询任务,从而在前端实现了任务的可视化,但我觉得我现在正在制作一个frankeistein应用程序,因为它们都是相互依存

你们怎么处理这种情况

ps:这里是我的上下文代码摘录

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 %}