正确的Django应用程序结构以及处理视图和子视图

时间:2017-12-07 21:34:29

标签: python django python-3.x django-templates django-views

为了理解Django应用程序应该如何正确构建,我有点挣扎。特别是,我很难理解这些观点。

所以我有这个文件

base.html

我知道这个文件将包含整个应用程序的常用元素,如页脚,导航栏,头等。

到目前为止一切顺利。 在我的base.html文件中,我将获得标记:

{% block content %}
{% endblock %}

它处理应用程序的动态内容。 现在我创建一个名为home.html的静态页面,并在该文件中放入

{% extends 'base.html' %}
... Whatever I want
{% block content %}

现在,我真的很难理解它是如何工作的。 我创建了一个名为dashboard的新应用。我创建了一个dashboard.html文件,与home.html类似,我扩展了content block内的基础和元素。在我生成的应用程序的views.py中定义:

@login_required(login_url="login/")
def dashboard(request):
    return render(request, "dashboard.html")

dashboard.html

{% extends 'base.html' %}
{% block content %}
    <div class="dashboard-page">
        <div class="row equal-sides">
            <div class="col-sm-2 trim-right">
                {% include 'dashboard_navigation.html' %}
            </div>
            <div class="col-sm-10 trim-left">
                <div class="dashboard-main card">
                   <h3>Welcome to your dashboard</h3>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

enter image description here

快乐的日子。现在我想重新加载右侧的主容器,具体取决于左侧导航栏的选择。我如何实现这一目标?

我认为如果我要在我的网址文件中添加一个新网址,并在views.py文件中添加一个相应的视图就可以了。

def single_search(request):
    tweets = get_tweets()
    context = {'tweets': tweets}
    return render(request, "search.html", context)

urls.py

url(r'^dashboard', views.dashboard, name='dashboard'),
url(r'^dashboard/search$', views.single_search, name='search'),

然而,我得到的是与dashboard.html相同的页面 enter image description here

我设法绕过问题并使用以下代码显示“正确”的内容:

{% extends 'base.html' %} {% block content %}
    <div class="dashboard-page">
        <div class="row equal-sides">
            <div class="col-sm-2 trim-right">
                {% include 'dashboard_navigation.html' %}
            </div>
            <div class="col-sm-10 trim-left">
                <div class="dashboard-main card">

                    {% if 'search' in request.path %}
                        {% include 'search.html' %}
                    {% else %}
                        <h3>Welcome to your dashboard</h3>
                    {% endif %}
                </div>
            </div>
        </div>
    </div> {% endblock %}

但我知道这不是正确的做法。我也知道我传递的上下文没有返回,因为它在include 'search.html'标记内。如果我在信息中心内传递了相同的上下文,那么它在search.htmldashboard.html中都有用,不幸的是,如果用户位于search.html子页面上,我只想查看该内容。

此外,我附上了我的申请表:

enter image description here

1 个答案:

答案 0 :(得分:2)

问题只是您没有终止仪表板网址模式,因此它与两个网址都匹配。它应该是:

url(r'^dashboard$', views.dashboard, name='dashboard'),

如果您发现正则表达式令人困惑,Django 2.0中的新path语法可能会更容易。