Django入门笔记(一)_建站基本流程

本文详细介绍了使用Django框架进行网站开发的全过程,从环境搭建、项目创建到模型定义、视图编写,再到模板设计与测试,最后实现超级用户管理功能。通过具体实例,深入浅出地讲解了Django框架的各个组件及其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

逻辑总览

在这里插入图片描述

基本环境

# 安装python3

# 安装virtualenv
pip3 install virtualenv

虚拟配置

# 生成激活
# win
virtualenv -p python3 BASE_DIR/../venv
venv/Scripts/activate

#linux
find / -name virtualenv
source venv/bin/activate


# 退出
deactivate

命令行

# 安装django
pip install django

# 查看版本
python -m django --version

# 创建项目
django-admin startproject mysite

# 创建app
django-admin startapp polls

# 运行服务器
python manage.py runserver

# 默认主页
http://127.0.0.1:8000/

创建模型

from django.db import models


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

    def __str__(self):
        return self.question_text


class Choice(models.Model):
    question = models.ForeignKey(Question,on_delete=models.CASCADE,related_name='choice')
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

# 迁移数据库
python manage.py makemigrations
python manage.py makemigrations polls
python manage.py migrate

URLconf

from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include


urlpatterns = [
    url(r'polls/', include('polls.urls')),
    url(r'admin/', admin.site.urls),
]
from django.conf.urls import url

from . import views


app_name = 'polls'
urlpatterns = [
    url(r'^$', views.polls, name='polls'),
    url(r'^question_list/$', views.question_list, name='question_list'),
    url(r'^question_list/detail/(?P<question_id>\d+)/$', views.detail, name='detail'),
    url(r'^vote/(\d+)/$', views.vote, name='vote'),
    url(r'^results/(\d+)/$', views.results, name='results'),
]

视图编写

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.template import loader
from django.urls import reverse

from .models import Question,Choice


def polls(request):
    context = "the polls index"
    return render(request,'polls.html',{'context':context})
    # return HttpResponse(context)
    

def question_list(request):
    questions = Question.objects.all()
    return render(request,'question_list.html',{'questions':questions})


def detail(request,question_id):
    question = get_object_or_404(Question,pk=question_id)
    return render(request,'detail.html',{'question':question})


def vote(request,question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # 重新显示问题的投票表单
        return render(request, 'detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    selected_choice.votes += 1
    selected_choice.save()
    return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))


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

模板编写

# 复制样式文件
cp bootstrap.min.css BASE_DIR/polls/static/
  • cd BASE_DIR/polls/templates/
  • polls.html
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
<div class="container">
    <ol class="breadcrumb my-4">
        <li class="breadcrumb-item active">polls</li>
        <li class="breadcrumb-item"><a href="{% url 'polls:question_list' %}">question_list</a></li>
    </ol>
    <h1 class="breadcrumb my-4">{{ context }}</h1>
    <a href="{% url 'polls:question_list' %}"> show all question</a>
</div>
  • question_list.html
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
<div class="container">
    <ol class="breadcrumb my-4">
        <li class="breadcrumb-item"><a href="{% url 'polls:polls' %}">polls</a></li>
        <li class="breadcrumb-item active">question_list</li>
    </ol>

    <h1 class="breadcrumb my-4">question_list</h1>
    
    {% if not questions %}
    <p><strong>empty question</strong></p>

    {% else %}
    <table class="table">
        <thead class="thead-dark">
        <tr>
            <th>question_text</th>
            <th>pub_date</th>
        </tr>
        </thead>

        <tbody>
        {% for question in questions %}
        <tr>
            <td>
                <a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a>
                <small class="text-muted d-block">{{ forloop.counter }}</small>
            </td>
            <td class="align=middle">{{ question.pub_date }}</td>
        </tr>
        {% endfor %}
        </tbody>
    </table>

    {% endif %}
</div>
  • detail.html
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
<div class="container">
    <ol class="breadcrumb my-4">
        <li class="breadcrumb-item"><a href="{% url 'polls:polls' %}">polls</a></li>
        <li class="breadcrumb-item"><a href="{% url 'polls:question_list' %}">question_list</a></li>
        <li class="breadcrumb-item active">detail</li>
    </ol>
    
    <h1 class="breadcrumb my-4">{{ question.question_text }}</h1>

    {% if error_message %}
    <p><strong>{{ error_message }}</strong></p>
    {% endif %}

    {% if not question.choice.all %}
    <p><strong> empyt choice </strong></p>
    
    {% else %}
    <form action="{% url 'polls:vote' question.id %}" method="post">
    {% csrf_token %}
    {% for choice in question.choice.all %}
        <input type="radio" id="choice_{{ forloop.counter }}" name="choice" value="{{ choice.id }}" />
        <label for="choice_{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
    {% endfor %}
    <input type="submit" value="Vote" />
    </form>     

    {% endif %}
</div>
  • results.html
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
<div class="container">
    <ol class="breadcrumb my-4">
        <li class="breadcrumb-item"><a href="{% url 'polls:polls' %}">polls</a></li>
        <li class="breadcrumb-item"><a href="{% url 'polls:question_list' %}">question_list</a></li>
        <li class="breadcrumb-item active">result</li>
    </ol>
    
    <h1 class="breadcrumb my-4">{{ question.question_text }}</h1>

    <table class="table">
        <thead class="thead-dark">
        <tr>
            <th>choice</th>
            <th>count</th>
        </tr>
        </thead>

        <tbody>
        {% for choice in question.choice.all %}
        <tr>
            <td>{{ choice.choice_text }}</td>
            <td>{{ choice.votes }} vote{{ choice.votes|pluralize }}</td>
        </tr>
        {% endfor %}
        </tbody>
    </table>
    <a href="{% url 'polls:detail' question.id %}">Vote again?</a>	
</div>

全局settings

# 添加app
INSTALLED_APPS = [
    #...
    'polls',  
]


# 设置html模版文件路径
TEMPLATES = [
    {
        #...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        #...
    },
]


# 静态文件
STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

测试

from django.test import TestCase
from django.urls import reverse,resolve

from .views import polls, question_list, detail, vote ,results
from .models import Question
from django.utils import timezone



class PollsTests(TestCase):
    def test_polls_view_status_code(self):
        url = reverse('polls:polls')
        response = self.client.get(url)
        self.assertIs(response.status_code,200)
        self.assertContains(response,'polls')


    def test_polls_url_resolve_polls_view(self):
        view = resolve('/polls/')
        self.assertEqual(view.func,polls)



class Question_listTests(TestCase):
    def test_question_list_status_code(self):
        Question.objects.create(question_text="test_question_list_status_code",pub_date=timezone.now())
        url = reverse('polls:question_list')
        response = self.client.get(url)
        self.assertIs(response.status_code,200) 


    def test_question_list_status_code_empty(self):
        url = reverse('polls:question_list')
        response = self.client.get(url)
        self.assertIs(response.status_code,200) 
        self.assertContains(response,'empty')
        self.assertQuerysetEqual(response.context['questions'],[])


    def test_question_list_url_resolve_polls_view(self):
        view = resolve('/polls/question_list/')
        self.assertEquals(view.func,question_list)



class DetailTests(TestCase):
    def setUp(self):
        q1=Question.objects.create(question_text="DetailTests",pub_date=timezone.now())
        q1.choice.create(choice_text='someone')
        q2=Question.objects.create(question_text="DetailTests_empty",pub_date=timezone.now())


    def test_detail_view_status_code(self):
        url = reverse('polls:detail',args=(1,))
        response = self.client.get(url)
        self.assertIs(response.status_code,200)


    def test_detail_view_status_code_empty(self):
        url = reverse('polls:detail',args=(2,))
        response = self.client.get(url)
        self.assertContains(response,'empty')


    def test_detail_url_resolve_polls_view(self):
        view = resolve('/polls/question_list/detail/1/')
        self.assertEqual(view.func,detail)



class VoteTests(TestCase):
    def test_vote_url_resolve_polls_view(self):
        view = resolve('/polls/vote/1/')
        self.assertEqual(view.func,vote)



class ResultsTests(TestCase):
    def setUp(self):
        Question.objects.create(question_text="ResultsTests",pub_date=timezone.now())   


    def test_result_view_status_code(self):
        url = reverse('polls:results',args=(1,))
        response = self.client.get(url)
        self.assertIs(response.status_code,200)


    def test_result_url_resolve_polls_view(self):
        view = resolve('/polls/results/1/')
        self.assertEqual(view.func,results)
# 执行测试
python manage.py test

超级用户

# 创建超级用户
python manage.py createsuperuser

# 复制模板到项目模板文件
cp django/contirb/admin/templates/base_site.html BASE_DIR/templates/admin/

# vi BASE_DIR/templates/admin/base_site.html
#...
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
#...
from django.contrib import admin

from .models import Question, Choice


class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        ('Question',{'fields':['question_text']}),
        ('Date information',{'fields':['pub_date'],'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]
    list_display = ('question_text', 'pub_date')
    list_filter = ['pub_date']
    search_fields = ['question_text']


class ChoiceAdmin(admin.ModelAdmin):
    fields=['question','choice_text','votes']
    list_display = ('choice_text','question','votes')


admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice, ChoiceAdmin)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值