4.用户账户

4.1 让用户能够输入数据

添加新主题

# untitled/learning_logs/forms.py
from django import formsfrom .models import Topic, Entryclass TopicForm(forms.ModelForm):class Meta:model = Topicfields = ['text']labels = {'text':''}
"""定义learning_logs的URL模式"""
# untitled/learning_logs/urls.py
from django.conf.urls import urlfrom . import viewsapp_name = 'learning_logs'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'),
]
# untitled/learning_logs/views.py
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reversefrom learning_logs.forms import TopicForm
from learning_logs.models import Topic#···def new_topic(request):"""添加新主题"""if request.method != 'POST':form = TopicForm()else:form = TopicForm(request.POST)if form.is_valid():form.save()return HttpResponseRedirect(reverse('learning_logs:topics'))context = {'form':form}return render(request, 'learning_logs/new_topic.html', context)#···
<!-- untitled/templates/learning_logs/new_topic.html -->
{% extends "learning_logs/base.html" %}{% block content %}<p>Add a new topic:</p><form action="{% url 'learning_logs:new_topic' %}" method='post'>{% csrf_token %}{{ form.as_p }}<button name="submit">add topic</button></form>{% endblock content %}

添加新条目
(略)
编辑新条目
(略)

4.2 创建用户账户

应用程序users

# untitled/untitled/settings.py
# ···
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',# 我的应用程序'learning_logs','users'
]# ···
# untitled/untitled/urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import include, urlurlpatterns = [path('admin/', admin.site.urls),url(r'^users/', include('users.urls', namespace='users')),url(r'', include('learning_logs.urls', namespace='learning_logs')),
]

4.2.1 登录

由于Django版本的问题,下面的URL模式跟《Python编程从入门到实践》的示例有点不一样。

"""为应用程序users定义URL模式"""
# untitled/users/urls.py
from django.contrib.auth.views import LoginView
from django.urls import pathapp_name = 'users'urlpatterns = [path('login/', LoginView.as_view(template_name='users/login.html'), name="login"),
]
<!-- untitled/templates/users/login.html -->
{% extends "learning_logs/base.html" %}{% block content %}{% if form.errors %}<p>Your username and password didn't match. Please try again.</p>{% endif %}<form method="post" action="{% url 'users:login' %}">{% csrf_token %}{{ form.as_p }}<button name="submit">log in</button><input type="hidden" name="next" value="{% url 'learning_logs:index' %}" /></form>{% endblock content %}
<!-- untitled/templates/learning_logs/base.html -->
<p><a href="{% url 'learning_logs:index' %}">Learning Log</a> -<a href="{% url 'learning_logs:topics' %}">Topics</a> - {% if user.is_authenticated %}Hello, {{ user.username }}.{% else %}<a href="{% url 'users:login' %}">log in</a>{% endif %}
</p>{% block content %}{% endblock %}

4.2.2 注销

# untitled/users/urls.py
from django.contrib.auth.views import LoginView
from django.urls import path
from django.conf.urls import urlfrom . import viewsapp_name = 'users'urlpatterns = [path('login/', LoginView.as_view(template_name='users/login.html'), name="login"),url(r'^logout/$', views.logout_view, name='logout'),
]

注意下面导入的是from django.urls import reverse,而不是from django.core.urlresolvers import reverse

# untitled/users/views.py
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth import logoutdef logout_view(request):"""Log the user out."""logout(request)return HttpResponseRedirect(reverse('learning_logs:index'))

4.2.3 注册

# untitled/users/views.py
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from django.contrib.auth import logout, authenticate, login# ···def register(request):if request.method != 'POST':form = UserCreationForm()else:form = UserCreationForm(data=request.POST)if form.is_valid():new_user = form.save()authenticated_user = authenticate(username=new_user.username, password=request.POST['password1'])login(request, authenticated_user)return HttpResponseRedirect(reverse('learning_logs:index'))context = {'form':form}return render(request, "users/register.html", context)
<!-- untitled/templates/users/register.html -->
{% 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 %}

4.3 让用户拥有自己的数据

使用@login_required限制访问

# untitled/learning_logs/views.py
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect
from django.shortcuts import render# ···@login_required
def topics(request):topics = Topic.objects.order_by('date_added')context = {'topics' : topics}return render(request, 'learning_logs/topics.html', context)# ···
# untitled/untitled/settings.py# ···LOGIN_URL = '/users/login/'

将数据关联到用户
注意这行代码owner = models.ForeignKey('auth.User', on_delete=models.CASCADE)的写法。

# untitled/learning_logs/models.py
from django.db import models
from django.contrib.auth.models import Userclass Topic(models.Model):"""A topic the user is learning about."""text = models.CharField(max_length=200)date_added = models.DateTimeField(auto_now_add=True)owner = models.ForeignKey('auth.User', on_delete=models.CASCADE)def __str__(self):"""Return a string representation of the model."""return self.text

我们迁移数据库时,Django将对数据库进行修改,使其能够存储主题和用户之间的关联。
执行python manage.py makemigrations learning_logs时,我们为外键值指定默认值。

只允许用户访问自己的主题

# untitled/learning_logs/views.py# ···@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)# ···

保护用户的主题

# untitled/learning_logs/views.py# ···@login_required
def topic(request, topic_id):topic = Topic.objects.get(id=topic_id)if topic.owner != request.user:raise Http404entries = topic.entry_set.order_by('-date_added')context = {'topic': topic, 'entries': entries}return render(request, 'learning_logs/topic.html', context)# ···

保护页面edit_entry

# untitled/learning_logs/views.py# ···@login_required
def edit_entry(request, entry_id):"""Edit an existing entry."""entry = Entry.objects.get(id=entry_id)topic = entry.topicif topic.owner != request.user:raise Http404if request.method != 'POST':# Initial request; pre-fill form with the current entry.form = EntryForm(instance=entry)else:# POST data submitted; process data.form = EntryForm(instance=entry, data=request.POST)if form.is_valid():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)

将新主题关联到当前用户

# untitled/learning_logs/views.py# ···@login_required
def new_topic(request):"""添加新主题"""if request.method != 'POST':form = TopicForm()else:form = TopicForm(request.POST)if form.is_valid():new_topic = form.save(commit=False)new_topic.owner = request.usernew_topic.save()return HttpResponseRedirect(reverse('learning_logs:topics'))context = {'form':form}return render(request, 'learning_logs/new_topic.html', context)# ···

参考资料:《Python编程从入门到实践》—【美】Eric Matthes 著

转载于:https://www.cnblogs.com/gzhjj/p/10591249.html

Django入门项目实践(中)相关推荐

  1. 【机器学习基础】SVM算法在项目实践中的应用!

    作者:苏丽敏,Datawhale优秀学习者,北理工计算机硕士 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维 ...

  2. SVM算法在项目实践中的应用!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:苏丽敏,Datawhale优秀学习者,北理工计算机硕士 支持向量机 ...

  3. SAP WM Storage Location Reference在项目实践中的使用

    SAP WM Storage Location Reference在项目实践中的使用 笔者目前所在的一个项目是一个已经上了SAP系统,但是需要扩展到新工厂的项目.该项目在组织结构设计的时候,结合业务的 ...

  4. Django 入门项目案例开发(上)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. Django 入门案例开发(中) http://www.cnblogs.com/focusBI ...

  5. 基于知识图谱的医药领域问答项目实践中所遇到的问题

    一.代码来源: 中科院软件所刘焕勇老师在github上的开源项目 原项目地址:https://github.com/liuhuanyong/QASystemOnMedicalKG 修改版项目地址(详细 ...

  6. [PHP] 项目实践中使用的IOC容器思想

    1.容器的意思就是一个全局变量,里面存了很多对象,如果要用到某个对象就从里面取,前提就是要先把对象放进去 2.控制反转就是把自己的控制权交给别人 3.这两个结合就是,把自己的控制权交给别人并且创建的对 ...

  7. 项目实践中Linux集群的总结和思考

    2019独角兽企业重金招聘Python工程师标准>>> 前言:作为一名Linux/unix系统工程师.项目实施工程师,这几年一直在涉及到对外项目,经手过许多小中型网站的架构,F5.L ...

  8. Django 入门项目案例开发(中)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. 昨天已经描述了如何搭建Django的开发环境,今天描述业务流程,具体我们要实现一个什么样的业务 ...

  9. Django入门-项目创建与初识子应用

    一.预备知识 HTTP协议的认识 HTTP协议就是客户端和服务端之间数据传输的格式规范,格式简称为"超文本传输协议". 基于TCP/IP (1)HTTP是一个属于应用层的面向对象的 ...

最新文章

  1. 【Linux】一步一步学Linux——yes命令(248)
  2. 设计模式之_Iterator_03
  3. Java-变量、常量
  4. oracle的存储设置默认参数,oracle初始化参数设置
  5. 怎么查看mysql帮助文档_高效查看MySQL帮助文档的方法
  6. php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
  7. Windows平台JDK安装
  8. 视频换脸新境界:CMU不仅给人类变脸,还能给花草、天气变脸 | ECCV 2018
  9. 再学 GDI+[86]: TGPImage(6) - 拖动图像
  10. 大厂面试常问的机器学习,计算机视觉怎么学?详细指南来了!
  11. 用python搭建环境_搭建一个即开即用的Python环境
  12. MyBatis+MySQL 返回插入的主键ID
  13. PhpStorm WebStorm IDEA 官方汉化插件
  14. oa系统源码 python_区块链技术基于springboot的办公oa系统实现源代码
  15. Dell(戴尔)Alienware(外星人)Alienware Command Center(AWCC)更新失败解决方案(究极版)
  16. 三星android pie,三星Galaxy系列Android 9.0 Pie
  17. ERP、CRM、SCM、BPM、DSS... ...这10种主流的B端产品你都知道吗?
  18. 51单片机距离测试软件,单片机超声波传感器测量距离
  19. nian shi ti是什么鬼????
  20. 泛函分析的几个空间和平行四边形法则

热门文章

  1. Ionic+Angular+Express实现前后端交互使用HttpClient发送get请求数据并加载显示(附代码下载)
  2. 从实例一步一步入门学习SpringCloud的Eureka、Ribbon、Feign、熔断器、Zuul的简单使用(附代码下载)
  3. Ubuntu Server 16.04 LTS上使用Docker部署Tomcat修改为80端口
  4. jsp中通过多种方式实现面包屑导航
  5. 利用Python实现gif动图倒放
  6. 使用JProfiler查看GC Roots
  7. 【Python】编程笔记11
  8. 金融贷款逾期的模型构建3——模型评估
  9. 十分钟学习nginx
  10. 敏捷领导者所需的技能