编写你的第一个 Django 应用程序,第6部分

Posted xh2023

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写你的第一个 Django 应用程序,第6部分相关的知识,希望对你有一定的参考价值。

Django

本教程从教程 5 停止的地方开始。我们已经构建了一个经过测试的网络投票应用程序,现在我们将添加一个样式表和一个图像。

除了服务器生成的 HTML 之外,Web 应用程序通常需要提供呈现完整网页所需的其他文件(例如图像、JavaScript 或 CSS)。在 Django 中,我们将这些文件称为“静态文件”。

对于小型项目,这没什么大不了的,因为您可以将静态文件保存在Web服务器可以找到的地方。但是,在较大的项目中(尤其是由多个应用程序组成的项目),处理每个应用程序提供的多组静态文件开始变得棘手。

这就是 django.contrib.staticfiles 的用途:它将每个应用程序(以及您指定的任何其他位置)的静态文件收集到一个可以在生产中轻松提供的位置。

 

一、自定义应用的外观和感觉

首先,在 polls 目录中创建一个名为 static 的目录。Django 将在那里查找静态文件,类似于 Django 在 polls/templates/ 中查找模板的方式。

Django 的 STATICFILES_FINDERS 设置包含一个发现者列表,这些查找器知道如何从各种来源发现静态文件。

默认值之一是 AppDirectoriesFinder ,它在每个 INSTALLED_APPS 中查找一个“静态”子目录,就像我们刚刚创建的 polls 中的子目录一样。管理站点对其静态文件使用相同的目录结构。

在您刚刚创建的 static 目录中,创建另一个名为 polls 的目录,并在该目录中创建一个名为 style.css 的文件。

换句话说,您的样式表应该在 polls/static/polls/style.css 。

由于 AppDirectoriesFinder 静态文件查找器的工作方式,您可以在 Django 中将此静态文件称为 polls/style.css ,类似于您引用模板路径的方式。

将以下代码放入该样式表 ( polls/static/polls/style.css ):

li a 
    color: red;

接下来,在 polls/templates/polls/index.html 的顶部添加以下内容:

% load static %

<link rel="stylesheet" href="% static \'polls/style.css\' %">


static % 模板标签生成静态文件的绝对 URL。

这就是您需要为开发所做的一切。

启动服务器(如果它已经在运行,则重新启动它):

$ python manage.py runserver

重新加载 http://localhost:8000/polls/ ,你应该看到问题链接是绿色的(Django风格!),这意味着你的样式表已正确加载。

二、添加背景图像

接下来,我们将为图像创建一个子目录。在 polls/static/polls/ 目录中创建一个 images 子目录。

在此目录中,添加要用作背景的任何图像文件。出于本教程的目的,我们使用一个名为 background.png 的文件,

该文件将具有完整路径 polls/static/polls/images/background.png 。

然后,在样式表中添加对图像的引用 ( polls/static/polls/style.css ):

body 
    background: white url("images/background.png") no-repeat;


li a 
    color: red;

重新加载 http://localhost:8000/polls/ ,您应该会看到屏幕左上角加载的背景。

 

这些是基础知识。有关框架中包含的设置和其他位的更多详细信息,请参阅静态文件操作方法和静态文件参考。

部署静态文件讨论了如何在真实服务器上使用静态文件。

当你熟悉静态文件时,请阅读本教程的第 7 部分,了解如何自定义 Django 自动生成的管理站点。

-----------------------------------end-------------------------------------

 

编写你的第一个Django应用程序,第四部分

本教程从随笔三停止的地方开始。这里将重点放简单的表单处理和削减我们的代码。

写一个简单的表单

更新模版文件polls/detail.html,以便包含一个html<form>元素:

<body>
    <h1>{{ question.question_text }}</h1>
    {% if error_message %}<p><strong>{{ error_message }}</strong>></p>>{% endif %}
    <form action="{% url ‘polls:vote‘ question.id %}" method="post">
    {% csrf_token %}
    {% for choice in question.choice_set.all %}
        <input type="radio" name="choice" id="choice{{ forloop.counter}}" value="{{ choice.id}}">
        <label for ="choice{{ forloop.counter}}">{{ choice.choice_text }}</label><br />
    {% endfor %}
    <input type="submit" value="Vote">
    </form>
</body>

说明:

  • 上面的模版为每个问题选项显示一个单选按钮。value按钮相关联的是问题的选择的ID。name为每个单选按钮的choice。这意味着,当有人选择其中一个单选按钮并提交表单时,它将发送post数据choice=#,#表示所选选项的id。
  • forloop.counter表示for标签经过其循环的次数
  • 由于我们正在创建POST表单(可能会影响其循环的次数)。简而言之,所有以内部URL为目标的POST表单都应使用模版标记:{% csrf_token %}

表单写完,就创建一个处理提交数据的django视图。并对其进行处理。

打开polls/views.py文件编写代码:

from django.urls import reverse

def vote(request,question_id):
    question=get_object_or_404(Question,pk=question_id)
    try:
        selected_choice=question.choice_set.get(pk=request.POST[choice])
    except(KeyError,Choice.DoesNotExist):
        return render(request,polls/detail,{
        question:question,
        error_message:"You didn‘t select a choice.",
    })
    else:
        selected_choice.votes+=1
        selected_choice.save()
        return HttpResponse(reverse(polls:results,args=(question_id)))

 

这段代码包含本教程尚未涉及的一些内容:

  • request.POST是一个类似字典的对象,可以通过key访问提交的数据。request.POST[‘choice‘]以字符串形式返回所选项的ID。
  • 如果request.POST[‘choice‘] KeyError,在POST数据中没有提供。将会引发error。上面的代码会检查并重新显示问题并显示错误消息。You didn‘t select a choice.
  • 增加了一个票数选择计数,代码将返回一个HttpResponseRedirect。而不是一个正常的response。HttpResponseRedirect只有一个参数:用户将被重定向到URL。
  • reverse()调用将返回一个类似的字符串:‘/polls/3/results/‘。这个将重定向的URL会调用‘results’视图显示最终结果。

技术分享图片

当人在问题中投票后,该vote()视图将到results页面。我们来写下这个观点:

polls/views.py:

def results(request,question_id):
    question=get_object_or_404(Question,pk=question_id)
    return render(request,polls/results.html,{question:question})

 

可以看出,这和detail视图几乎一样。等下解决此冗余。

再去模版目录下创建:polls/results.html

<body>
    <h1>{{ question.question_text }}</h1>
    <ul>
        {% for choice in question.choice_set.all %}
        <li>
            {{ choice.choice_text }} -- {{ choice.votes }}
            票
        </li>
        {% endfor %}
    </ul>
    <a href="{% url ‘polls:detail‘ question.id %}">继续投票?</a>
</body>
</html>

 

现在,可以进行投票了。输入127.0.0.1/polls 然后一直点击下去。

技术分享图片

使用通用视图

之前有提到两个视图代码几乎一样。冗余的,django提供了一个称为‘通用视图‘系统的快捷方式。

将会:

  1. 转换URLconf
  2. 删除一些旧的不需要的视图
  3. 基于django的通用视图引入新的视图

 修改URL配置

首先打开polls/urls.py更改代码:

 

以上是关于编写你的第一个 Django 应用程序,第6部分的主要内容,如果未能解决你的问题,请参考以下文章

Django L2 编写你的第一个Django应用,第2部分¶

编写你的第一个 Django 应用程序,第8部分

编写你的第一个 Django 应用程序,第4部分

编写你的第一个Django应用程序,第四部分

编写你的第一个 Django 应用半成品

编写你的第一个Django应用程序