二 Django入门( 九 )


# vim users/templates/users/register.html
{% extends "learning_logs/base.html" %}{% block content %}

{% csrf_token %}{{ form.as_p }}{% endblock content %}

# vim learning_logs/templates/learning_logs/base.html
Learning Log -Topics -{% if user.is_authenticated %}Hello, {{ user.username }}.log out{% else %}register -log in{% endif %}
{% block content %}{% endblock content %}

现在 , 已登录的用户看到的是个性化的问候语和注销链接 , 而未登录的用户看到的是注册链接和登录链接 。
需要注意的是 , 这里的注册系统允许用户创建任意数量的账户 。实际情况下的系统会要求用户确认其身份:发送一封确认邮件或者用手机验证码 , 用户回复后其账户才生效 。通过这样做 , 系统生成的垃圾账户将比这里使用的简单系统少 。
让用户拥有自己的数据
用户应该能够输入其专有的数据 , 因此我们将创建一个系统 , 确定各项数据所属的用户 , 再限制对页面的访问 , 让用户只能使用自己的数据 。
下面将修改模型Topic  , 让每个主题都归属于特定用户 。这也将影响条目 , 因为每个条目都属于特定的主题 。
使用@限制
提供了装饰器@ , 让你能够轻松地实现这样的目标:对于某些页面 , 只允许已登录的用户访问它们 。装饰器()是放在函数定义前面的指令 , 在函数运行前 , 根据它来修改函数代码的行为 。
# vim learning_logs/views.py
from django.shortcuts import renderfrom django.http import HttpResponseRedirectfrom django.urls import reversefrom django.contrib.auth.decorators import login_requiredfrom .models import Topic, Entryfrom .forms import TopicForm, EntryFormdef index(request):"""学习笔记的主页"""return render(request, 'learning_logs/index.html')@login_requireddef topics(request):"""显示所有主题"""topics = Topic.objects.order_by('date_added')context = {'topics': topics}return render(request, 'learning_logs/topics.html', context)def topic(request, topic_id):"""显示一个主题及其详细页面"""topic = Topic.objects.get(id=topic_id)entries = topic.entry_set.order_by('-date_added')context = {'topic': topic, 'entries': entries}return render(request, 'learning_logs/topic.html', context)def new_topic(request):"""添加新主题"""if request.method != 'POST':# 未提交数据:创建一个新表单form = TopicForm()else:# POST提交的数据 , 对数据进行处理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)def new_entry(request, topic_id):"""在特定的主题中添加新条目"""topic = Topic.objects.get(id=topic_id)if request.method != 'POST':# 未提交数据 , 创建一个空表单form = EntryForm()else:# POST提交的数据 , 对数据进行处理form = EntryForm(data=http://www.kingceram.com/post/request.POST)if form.is_valid():new_entry = form.save(commit=False)new_entry.topic = topicnew_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)def edit_entry(request, entry_id):"""编辑既有条目"""entry = Entry.objects.get(id=entry_id)topic = entry.topicif request.method != 'POST':# 初次请求 , 使用当前条目填充表单form = EntryForm(instance=entry)else:# POST提交的数据 , 对数据进行处理form = EntryForm(instance=entry, data=http://www.kingceram.com/post/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/new_entry.html', context)