Django入门

        在此我将用Django来开发一个名为“Learning Log“的项目。这个项目让用户能够记录感兴趣的主题,并在学习每个主题的过程中可以添加日志条目。”Learning Log“的主页对这个网站进行描述,并邀请用户注册或者登录。用户登陆后就可创建新主题,添加新条目,以及阅读既有的条目。每个用户都有自己的数据,每个用户仅可观看和修改自己所拥有的条目。

一、效果图

二、文件存储路径图

三。创建项目以及所需文件

1、创建Learning_log项目。

2、创建数据库

python manage.py migrate

在使用SQLite的新项目中首次执行migrate这个命令式,Django将新建一个数据库。

3.安装django-bootstrap3

pip install django-bootstrap3

4、创建应用程序

命令 startapp appname 让Django建立创建应用程序所需的基础设施。

python manage.py startapp learning_logs#创建learning_logs应用程序
python manage.py startapp users#创建一个名为users的应用程序

4、定义模型

learning_logs/models.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Topic(models.Model):
    '''用户学习的主题'''
    text=models.CharField(max_length=200)
    date_added=models.DateTimeField(auto_now_add=True)
    owner=models.ForeignKey(User)

    def __str__(self):
        '''返回模型的字符串表示'''
        return self.text

class Entry(models.Model):
    '''学到的有关某个主题的具体知识'''
    topic=models.ForeignKey(Topic)
    text=models.TextField()
    date_added=models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural='entries'

    def __str__(self):
        '''返回模型的字符串表示'''
        return self.text[:50]+"..."

settings.py

"""
Django settings for learning_log project.

Generated by 'django-admin startproject' using Django 1.11.6.

For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'xsxgdt)%7$b)ue=5lde!!s7d1-ey(ar0==li=g&t8)$5pluui!'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #第三方应用程序
    'bootstrap3',
    #我的应用程序
    'learning_logs',
    'users',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'learning_log.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'learning_log.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

STATIC_URL = '/static/'

#我的设置
LOGIN_URL='/users/login/'

#django-bootstrap3的设置
BOOTSTRAP3={
    'include_jquery':True,
}

admin.py

from django.contrib import admin

# Register your models here.
from learning_logs.models import Topic,Entry

admin.site.register(Topic)
admin.site.register(Entry)

修改数据库库和创建超级用户

  urls.py

"""learning_log URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'',include('learning_logs.urls',namespace='learning_logs')),
    url(r'^users/',include('users.urls',namespace='users')),
]

learning_logs/urls.py

"""定义learning_logs的URL模式"""
from django.conf.urls import url
from . import views
urlpatterns=[
    #主页
    url(r'^$',views.index,name='index'),
    #显示所有的主题
    url(r'^topics$',views.topics,name='topics'),
    #特定主题的详细页面
    url(r'^topics/(?P<topic_id>d+)/$',views.topic,name='topic'),
    #用于添加新主题的网页
    url(r'^new_topic/$',views.new_topic,name='new_topic'),
    #用于添加新条目的页面
    url(r'^new_entry/(?P<topic_id>d+)/$',views.new_entry,name='new_entry'),
    #用于编辑条目的页面
    url(r'^edit_entry/(?P<entry_id>d+)/$',views.edit_entry,name='edit_entry'),
]

learning_logs/views.py

from django.shortcuts import render
from .models import Topic,Entry
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from .forms import  TopicForm,EntryForm
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect,Http404


# Create your views here.
def index(request):
    '''学习笔记的主页'''
    return render(request, 'learning_logs/index.html')

@login_required
def topics(request):
    '''显示所有的主题'''
    topics=Topic.objects.filter(owner=request.user).order_by('date_added')
    context={'topics':topics}
    return render(request, 'learning_logs/topics.html', context)

@login_required
def topic(request,topic_id):
    '''显示单个主题及其所有的条目'''
    topic=Topic.objects.get(id=topic_id)
    if topic.owner!=request.user:
        raise Http404
    entries=topic.entry_set.order_by('-date_added')
    context={'topic':topic,'entries':entries}
    return render(request, 'learning_logs/topic.html', context)

@login_required
def new_topic(request):
    '''添加新主题'''
    if request.method!='POST':
        #未提交数据:创建一个新表单
        form=TopicForm(request.POST)
    else:
        #POST提交的数据,对数据进行处理
        form=TopicForm(request.POST)
        if form.is_vaild():
            new_topic=form.save(commit=False)
            new_topic.owner=request.user
            new_topic.save()
            form.save()
            return HttpResponseRedirect(reverse('learning_logs:topics'))

    context={'form':form}
    return render(request, 'learning_logs/new_topic.html', context)

@login_required
def new_entry(request,topic_id):
    '''在特定的主题中添加新条目'''
    topic=Topic.objects.get(id=topic_id)

    if request.method!='POST':
        #未提交数据,创建一个新表单
        form=EntryForm()
    else:
        #POST提交的数据,对数据进行处理
        form=EntryForm(data=request.POST)
        if form.is_valid():
            new_entry=form.save(commit=False)
            new_entry.topic=topic
            new_entry.save()
            return HttpResponseRedirect(reverse('learning_logs:topic',args=[topic_id]))

    context = {'topic':topic,'form': form}
    return render(request, 'learning_logs/new_entry.html', context)

@login_required
def edit_entry(request,entry_id):
    '''编辑既有条目'''
    entry=Entry.objects.get(id=entry_id)
    topic=entry.topic
    if topic.owner!=request.user:
        raise Http404

    if request.method!='POST':
        #初次请求,使用当前条目填充表单
        form=EntryForm(instance=entry)
    else:
        #POST提交的数据,对数据进行处理
        form=EntryForm(instance=entry,data=request.POST)
        if form.is_vail():
            form.save()
            return HttpResponseRedirect(reverse('learning_logs:topic',args=[topic.id]))

    context = {'entry': entry,'topic':topic, 'form': form}
    return render(request, 'learning_logs/edit_entry.html', context)

forms.py

from django import forms
from .models import Topic,Entry

class TopicForm(forms.ModelForm):
    class Meta:
        model=Topic
        fields=['text']
        labels={'text':''}

class EntryForm(forms.ModelForm):
    class Meta:
        model=Entry
        fields=['text']
        labels={'text':''}
        widgets={'text':forms.Textarea(attrs={'cols':80})}

在文件夹learning_logs中新建一个文件夹并将其命名为templates。在文件夹templates中,在创建一个名为learning_logs的文件夹,之后的模板都将保存在这个文件夹中。

base.html

{% load bootstrap3 %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Learning Log</title>
    {% bootstrap_css %}
    {% bootstrap_javascript %}
</head>
<body>
<!--Static navbar-->
<nav class="navbar navbar-default navbar-static-top">
    <div class="container">
        <div class="navbar-header">
            <button class="navbar-toggle collapsed"
                    data-toggle="collapse" data-target="#navbar"
                    aria-expanded="false" aria-controls="navbar">
            </button>
            <a class="navbar-brand" href="{% url 'learning_logs:index' %}">Learning Log</a>
        </div>

        <div id="navbar" class="navbar-collapse collpase">
            <ul class="nav navbar-nav">
                <li> <a href="{% url 'learning_logs:topics' %}">Topics</a> </li>
            </ul>

            <ul class="nav navbar-nav navbar-right">
                {% if user.is_authenticated %}
                      Hello,{{ user.username }}.
                      <a href="{% url 'users:logout' %}">log out</a>
                {% else %}
                     <a href="{% url 'users:register' %}">register</a>
                     <a href="{% url 'users:login' %}">log in</a>
                {% endif %}

            </ul>
        </div><!--/.nav-collapse-->
    </div>
</nav>
<div class="container">
    <div class="page-header">
        {% block header %}{% endblock header %}
    </div>
<div>
    {% block content %}{% endblock content %}
</div>
</div><!--container容器-->
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% extends "learning_logs/base.html" %}
{% block header %}
    <div class="jumbotron">
    <h1>Track your learning.</h1>
    </div>
{% endblock header %}
{% block content %}
    <h2>
    <a href="{% url 'users:register' %}">Register an account</a>
    to make your own Learning Log,and list the topics you're learning about.
    </h2>
    <h2>
    Whenever you learn something new about a topic,make an entry summarizing what you've learned.
    </h2>
{% endblock content %}
</body>
</html>

topics.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% extends "learning_logs/base.html" %}

{% block header %}
    <h1>Topics</h1>
{% endblock header %}

{% block content %}

    <ul>
      {% for topic in topics %}
          <li>
          <h3>
            <a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
          </h3>
          </li>
      {% empty %}
          <li>No topics have been added yet.</li>
      {% endfor %}
    </ul>
    <h3><a href="{% url 'learning_logs:new_topic' %}">Add new topic</a></h3>
{% endblock content %}
</body>
</html>

topic.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% extends 'learning_logs/base.html' %}
{% block header %}
    <h2>{{ topic }}</h2>
{% endblock header %}

{% block content %}

    <p>
    <a href="{% url 'learning_logs:new_entry' topic.id %}">add new entry</a>
    </p>
    {% for entry in entries %}
    <div class="panel panel-default">
    <div class="panel-heading">
        <h3>
            {{ entry.date_added|date:'M d,Y H:i' }}
            <small>
                  <a href="{% url 'learning_logs:edit_entry' entry.id %}">edit entry</a>
            </small>
        </h3>
    </div>
    <div class="panel-body">
        {{ entry.text|linebreaks }}
    </div>
    </div><!--panel-->

    {% empty %}
        There are no entries for this topic yet.
    {% endfor %}


{% endblock content %}

</body>
</html>

new_topic.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% extends "learning_logs/base.html" %}
{% load bootstrap3 %}
{% block header %}
    <p>Add a new topic:</p>
{%  endblock header %}
{% block content %}

    <form action="{% url 'learning_logs:new_topic' %}"method="'post" class="form">
    {% csrf_token %}
        {% bootstrap_form form %}
        {% buttons %}
        <button name="submit" class="btn btn-primary">add topic</button>
        {% endbuttons %}
    </form>
{% endblock content %}

</body>
</html>

new_entry.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% extends "learning_logs/base.html" %}

{% block content %}
    <p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a> </p>
    <p>Add a new entry:</p>
    <form action="{% url 'learning_logs:new_entry' topic.id %}"method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button name="'submit">add entry</button>
    </form>
{% endblock content %}

</body>
</html>

edit_entry.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% extends "learning_logs/base.html" %}

{% block content %}
    <p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a> </p>
    <p>Edit entry:</p>
    <form action="{% url 'learning_logs:edit_entry' entry.id %}"method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button name="'submit">save entry</button>
    </form>
{% endblock content %}


</body>
</html>

users/urls.py

'''为应用程序users定义URL模式'''

from django.conf.urls import url
from django.contrib.auth.views import login

from .import views

urlpatterns=[
    #登录页面
    url(r'^login/$',login,{'template_name':'users/login.html'},name='login'),
    #注销
    url(r'^logout/$',views.logout_view,name='logout'),
    # 注册页面
    url(r'^register/$', views.register, name='register'),
]

在users文件夹中创建一个名为templates的文件夹,在其中创建一个名为users的文件夹以下的几个模板都将存储在其中。

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% extends "learning_logs/base.html" %}
{% load bootstrap3 %}
{% block header %}
    <h2>Log in to your account.</h2>
{% endblock header %}
{% block content %}

    <form method="post" action="{% url 'users:login' %}" class="form">
    {% csrf_token %}
        {% bootstrap_form form %}
        {% buttons %}
    <button name="submit" class="btn btn-primary">log in</button>
        {% endbuttons %}
    <input type="hidden"  name="next" value="{% url 'learning_logs:index' %}"/>
    </form>
{% endblock content %}

</body>
</html>

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% extends "learning_logs/base.html" %}
{% block content %}

    <form method="post" action="{% url 'users:register' %}">
    {% csrf_token %}
    {{ form.as_p }}
    <button name="submit">register</button>
    <input type="hidden" name="next" value=""{% url 'learning_logs:index' %}>
    </form>

{% endblock content %}

</body>
</html>

我也只是一个门外汉,刚刚接触Django,所以表述可能会很不明确,只能自己个人理解。所以,下面是我自己做的这个项目,希望能对你们有一定的帮助

链接:https://pan.baidu.com/s/1lMV95bfdHzhBYpvRTOlufw 密码:th4s

                                                                                                                                                                                                                                                  

原文地址:https://www.cnblogs.com/fromzore/p/8639757.html