”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 设置 Django 并构建投票应用程序:我最后两周的工作

设置 Django 并构建投票应用程序:我最后两周的工作

发布于2024-10-31
浏览:490

Setting Up Django and Building a Poll App: My Last Two Weeks of Work

过去两周,我一直致力于从头开始设置 Django 并构建一个简单的投票应用程序。本文将引导您完成我所做的一切,从安装 Python 和 Django 开始,设置虚拟环境,创建新项目,以及构建一个名为 polls 的功能应用程序。

1.设置 Python 和 Django
首先,我确保我的系统上安装了 Python。如果您还没有安装,可以从 python.org 下载。

第1步:安装Python并设置虚拟环境
我想隔离我的项目依赖项,所以我使用了虚拟环境。

# Install virtualenv if you don't have it
pip install virtualenv

# Create a virtual environment
virtualenv myenv

# Activate the environment
# On Windows:
myenv\Scripts\activate
# On macOS/Linux:
source myenv/bin/activate

第2步:安装Django
环境激活后,我安装了Django。

pip install django

然后我通过运行确认安装:

django-admin --version

2.开始一个新的 Django 项目:mysite
现在,是时候创建我的 Django 项目了。我决定将其命名为“我的网站”。

django-admin startproject mysite
cd mysite

这创建了带有设置和配置的 Django 项目的基本结构。

3.创建一个新的 Django 应用程序: polls
设置项目后,我创建了一个名为 polls 的新应用程序,其中包含我的投票应用程序的所有逻辑和视图。

python manage.py startapp polls

我将新应用程序添加到 mysite/settings.py 中的 INSTALLED_APPS 中:

INSTALLED_APPS = [
    # other installed apps
    'polls',
]

4。定义模型
我首先定义了两个模型:问题和选择。问题有问题文本和发布日期,而选择有对问题的引用并存储文本和投票计数。

这是民意调查应用程序中的 models.py 文件:

# models.py
import datetime
from django.db import models
from django.contrib import admin
from django.utils import timezone

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    @admin.display(
        boolean=True,
        ordering='pub_date',
        description='Published recently?',
    )
    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) 



5。创建数据库并运行迁移
接下来,我创建了数据库并应用了迁移:

python manage.py migrate

然后我为民意调查应用程序创建了迁移文件:

python manage.py makemigrations polls
python manage.py migrate

6。为民意调查应用程序编写视图
我编写了几个视图来处理显示问题列表、显示问题详细信息和显示投票结果。这些视图是基于类的,使用 Django 的内置通用视图。
创建民意调查视图
然后,我创建了控制如何向用户显示数据的视图。我使用 Django 的通用视图来使事情变得简单。

这是views.py文件:

# views.py
from django.http import HttpResponse
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.views import generic
from django.utils import timezone
from .models import Question, Choice

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_question_list'

    def get_queryset(self):
        """Return the last five published questions."""
        return Question.objects.order_by('-pub_date')[:5]

class DetailView(generic.DetailView):
    model = Question
    template_name = 'polls/detail.html'

    def get_queryset(self):
        """Exclude questions that aren't published yet."""
        return Question.objects.filter(pub_date__lte=timezone.now())

class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'

def vote(request, question_id):
    return HttpResponse(f"You're voting on question {question_id}.")

  • IndexView:显示最新问题列表。
  • DetailView:显示特定问题及其选择的详细信息。
  • ResultsView:投票后显示投票结果。 vote() 函数处理用户的投票提交。

7.配置 URL
我将 URL 模式添加到民意调查应用程序中的 urls.py 文件中,以将每个视图链接到特定 URL。

# urls.py
from django.urls import path
from . import views

app_name = 'polls'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('/', views.DetailView.as_view(), name='detail'),
    path('/results/', views.ResultsView.as_view(), name='results'),
    path('/vote/', views.vote, name='vote'),
]

8。为视图创建模板
最后,我创建了 HTML 模板来显示问题和结果。模板放置在 polls/templates/polls/ 文件夹中。

index.html

{% if latest_question_list %}
    
{% else %}

No polls are available.

{% endif %}

detail.html

{% csrf_token %}

{{ question.question_text }}

{% if error_message %}

{{ error_message }}

{% endif %} {% for choice in question.choice_set.all %}
{% endfor %}

result.html

{{ question.question_text }}

    {% for choice in question.choice_set.all %}
  • {{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}
  • {% endfor %}
Vote again?

运行应用程序
为了测试应用程序,我运行了开发服务器:

python manage.py runserver

导航到http://127.0.0.1:8000/polls/显示了投票列表,我可以查看详细信息、投票并查看结果。

在过去的两周里,我学习了如何设置 Django、创建项目以及构建功能齐全的民意调查应用程序。看到 Django 中的所有内容(从模型到视图再到模板)如何相互连接,真是令人着迷。这是一次很棒的经历,我很高兴能够了解更多有关 Django 强大功能的信息!

版本声明 本文转载于:https://dev.to/swahilipotdevs/setting-up-django-and-building-a-poll-app-my-last-two-weeks-of-work-16jl?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在空数据集上使用 MySQL 的 SUM 函数时如何返回“0”而不是 NULL?
    在空数据集上使用 MySQL 的 SUM 函数时如何返回“0”而不是 NULL?
    当不存在任何值时如何从 MySQL 的 SUM 函数中检索“0”MySQL 中的 SUM 函数提供了一种方便的方法来聚合数值价值观。但是,当查询期间没有找到匹配的行时,SUM 函数通常返回 NULL 值。对于某些用例,可能更需要返回“0”而不是 NULL。利用 COALESCE 解决问题此问题的解决...
    编程 发布于2024-11-08
  • useMemo 与 useCallback
    useMemo 与 useCallback
    介绍 React 提供了广泛的钩子来帮助我们高效地构建动态应用程序。在这些钩子中,useMemo和useCallback是提高组件性能的重要工具。尽管两者都有相似的目的——防止不必要的重新计算或函数重新创建——但它们适用于不同的场景。 在本文中,我们将探讨 useMemo 和 us...
    编程 发布于2024-11-08
  • 为什么 MDM 很重要:优势和商业价值
    为什么 MDM 很重要:优势和商业价值
    在当今的数字经济中,数据是每个成功企业的基石。随着组织生成的信息呈指数级增长,主数据的有效管理已成为当务之急。主数据管理 (MDM) 是管理组织关键数据资产(例如客户信息、产品详细信息和财务记录)的战略流程,确保所有部门和系统的准确性、一致性和可访问性。但为什么 MDM 很重要?更重要的是,它能带来...
    编程 发布于2024-11-08
  • 是什么导致 Google Chrome 的 Console.log() 中数组和对象的行为不一致?
    是什么导致 Google Chrome 的 Console.log() 中数组和对象的行为不一致?
    Google Chrome 的 console.log() 表现出数组和对象不一致的行为了解问题在 Google Chrome 中调试代码时,观察到 console.log() 在处理嵌套数组时表现得很奇怪。记录数组时,在记录后修改其内部值会导致记录的输出反映更新后的值而不是记录时的值。 Firef...
    编程 发布于2024-11-08
  • 在 PHP 中按对象字段对对象数组进行排序
    在 PHP 中按对象字段对对象数组进行排序
    在 PHP 中,有多种方法可以按对象字段对对象数组进行排序。以下是一些常见的方法: 将 usort() 函数与自定义比较函数结合使用 实现自定义排序算法 利用 array_multisort() 函数 将 usort() 函数与自定义比较函数结合使用 以下是在 PHP 中使用 us...
    编程 发布于2024-11-08
  • 注意 Java 中的类型转换
    注意 Java 中的类型转换
    Java是强类型语言,但仍然可以在不同类型的原始变量之间传递值。例如,我可以将 int 的值分配给 double ,没有任何问题,只要接收该值的类型的存储容量可以处理它。 参见下面每个原始类型的大小: 将值转移到具有更大存储容量的类型有一个技术名称:“扩大转换”。该术语在葡萄牙语中通常被翻译为“放...
    编程 发布于2024-11-08
  • 如何在 React 中构建天气应用
    如何在 React 中构建天气应用
    If you want to master crucial web development skills like working with API's, fetching data, and asynchronous functions such as async and await in Rea...
    编程 发布于2024-11-08
  • Go 和 Python 之间的 gRPC 通信
    Go 和 Python 之间的 gRPC 通信
    gRPC 是一个功能强大、高性能的远程过程调用 (RPC) 框架,尽管不如 REST 常用,但在某些场景中提供了显着的优势。 此外,它与语言无关,可以在任何环境中运行,使其成为服务器到服务器通信的理想选择。 我不会深入研究它的完整解释,但这里是 gRPC 的一般链接。我将提供实践教程 ...
    编程 发布于2024-11-08
  • CSS 定位中的position:sticky 和position:fixed 有何不同?
    CSS 定位中的position:sticky 和position:fixed 有何不同?
    浏览 CSS 定位的细微差别:揭开position:sticky 和position:fixed理解 CSS 定位的复杂性可能具有挑战性,尤其是对于 CSS 新手。经常出现的一个特殊困境是position:sticky 和position:fixed 之间的区别。本文深入探讨了显着差异,为那些寻求更...
    编程 发布于2024-11-08
  • 如何使用 JavaScript 将大字符串拆分为 N 大小的块?
    如何使用 JavaScript 将大字符串拆分为 N 大小的块?
    在 JavaScript 中将大字符串拆分为 N 大小的块要有效地将大字符串拆分为大小为 N 的较小块,您可以使用JavaScript 中的 String.prototype.match 方法。此方法使您能够将正则表达式模式应用于字符串并提取匹配的子字符串。使用 String.prototype.m...
    编程 发布于2024-11-08
  • 如何在 C++ 中不使用 getline() 将文件字节读入字符数组?
    如何在 C++ 中不使用 getline() 将文件字节读入字符数组?
    How to Retrieve File bytes into a Char Array in C 要在不使用 getline() 的情况下将文件字节读入 char 数组,请考虑使用 ifstream::read()。请按照下列步骤操作:打开文件:std::ifstream infile("...
    编程 发布于2024-11-08
  • 以下是一些符合条件的标题选项:

**选项 1(关注问题):**

* **如何在 Python 中创建真正不可变的对象:超越基础**

**选项 2(突出显示解决方案)
    以下是一些符合条件的标题选项: **选项 1(关注问题):** * **如何在 Python 中创建真正不可变的对象:超越基础** **选项 2(突出显示解决方案)
    Python 中的不可变对象:超越基本解决方案虽然标准元组类提供了不可变性,但本文探讨了创建不可变对象的更高级技术重写 __setattr__:一种有限的方法一个常见的解决方案是重写 setattr 方法。但是,即使在 init 函数中,这也会阻止属性设置。因此,它可能并不适合所有场景。子类化元组:...
    编程 发布于2024-11-08
  • Spring Boot:如何解决跨源问题
    Spring Boot:如何解决跨源问题
    跨源问题描述 您可能会遇到以下错误消息: 被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头 此错误表示对某个地址的请求已被 CORS 协议阻止,因为资源中缺少 Access-Control-Allow-Origin 标头。 ...
    编程 发布于2024-11-08
  • 处理日期和时区转换:为什么正确的 UTC 转换很重要
    处理日期和时区转换:为什么正确的 UTC 转换很重要
    在检索选定日期范围内的数据时,我们注意到我们的计算存在一定偏差。然而,当我们将日期减少一天时,数据完全匹配! 嗯……我们的代码中处理日期的方式可能存在问题。也许时区处理不正确——是的,我是对的! 当构建涉及来自不同时区的用户的应用程序时,正确处理日期可能很棘手。在 UTC 中存储日期是确保一致性的...
    编程 发布于2024-11-08
  • gRPC:你住在哪里?你吃什么?
    gRPC:你住在哪里?你吃什么?
    A primeira vez que ouvi falar sobre RPC foi em uma aula de sistema distribuídos, ainda quando estava cursando a graduação em Ciência da Computação. Ac...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3