在此我将用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