二 Django入门( 十 )


首先导入函数() , 将()作为装饰器用于视图函数()——在它前面加上符号@和 , 让在运行()的代码前先运行()的代码 。
()的代码检查用户是否已登录 , 仅当用户已登录时 , 才运行()的代码 。如果用户未登录 , 就重定向到登录页面 。
为了实现未登录的重定向 , 需要修改.py 。
# vim learning_log/settings.py#末尾添加# 我的设置LOGIN_URL = '/users/login/'
可以看到 , 现在直接点击会直接跳转到登录页 。
在项目“学习笔记”中 , 我们将不限制主页、注册页面和注销页面的访问 , 同时限制其它所有页面的访问 。
# 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)@login_requireddef 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)@login_requireddef 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)@login_requireddef 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)@login_requireddef 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)
如果你在未登录的情况下尝试访问这些页面 , 将被重定向到登录页面 。此外 , 你还不能单击到等页面的链接 , 如果你输入URL :8000// , 将重定向到登录页面 。对于所有与私有用户数据相关的URL , 都应限制对它们的访问 。
将数据关联到用户
现在将数据关联到提交它们的用户 。我们只需将最高层的数据关联到用户 , 这样更低层的数据将自动关联到用户 。在项目“学习笔记”中 , 应用程序的最高层数据是主题 , 而所有条目都与特定主题相关联 。只要每个主题都归属于特定用户 , 我们就能确定数据库中每个条目的所有者 。