二 Django入门(12)


from django.http import HttpResponseRedirect, Http404#导入Http404@login_requireddef 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)
服务器上没有请求的资源时 , 标准的做法是返回404响应 。首先导入了异常 , 并在用户请求它不能查看的主题时引发这个异常 。收到主题请求后 , 在渲染网页前检查该主题是否属于当前登录的用户 。如果请求的主题不归当前用户所有 , 我们就引发异常 , 让返回一个404错误页面 。
保护页面
页面的URL为:8000/// , 其中是一个数字 。下面来保护这个页面 , 禁止用户通过输入类似于前面的URL来访问其他用户的条目 。
# vim learning_logs/views.py
@login_requireddef edit_entry(request, entry_id):"""编辑既有条目"""entry = Entry.objects.get(id=entry_id)topic = entry.topicif topic.owner != request.user:#修改raise Http404if 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)
获取指定的条目以及与之相关联的主题 , 然后检查主题的所有者是否是当前登录的用户 , 如果不是 , 就引发异常 。
将新主题关联到当前用户
当前 , 用于添加新主题的页面存在问题 。如果你尝试添加新主题 , 将看到错误消息 , 指出.不能为NULL。的意思是说 , 创建新主题时 , 你必须指定其owner字段的值 。
# vim learning_logs/views.py
@login_requireddef new_topic(request):"""添加新主题"""if request.method != 'POST':# 未提交数据:创建一个新表单form = TopicForm()else:# POST提交的数据 , 对数据进行处理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)
首先调用form.save() , 并传递实参=False , 因为我们先修改新主题 , 再将其保存到数据库中 。
接下来 , 将新主题的owner属性设置为当前用户 。最后 , 对刚定义的主题实例调用save() 。现在主题包含所有必不可少的数据 , 将被成功地保存 。
现在 , 这个项目允许任何用户注册 , 而每个用户想添加多少新主题都可以 。但每个用户都只能访问自己的数据 , 无论是查看数据、输入新数据还是修改旧数据时都如此 。