博客五部曲之二 - 高级博客


1259 浏览 5 years, 4 months

26 用户登陆需求

版权声明: 转载请注明出处 http://www.codingsoho.com/

像评论的删除视图,这个只有登录只能才能操作,所以我们可以用django自带的装饰器decorator来完成

from django.contrib.auth.decorators import login_required

@login_required(login_url="/login/")
def comment_delete(request, id):

比如执行http://127.0.0.1:8000/comments/41/delete,如果当时未登录,它会跳转到http://127.0.0.1:8000/login/?next=/comments/41/delete

我们通过@login_required(login_url=”/login”装饰函数comment_delete,同时指定跳转登录URL。这个URL也可以在settings里设置,这样装饰器这儿可以不指定这个参数

LOGIN_URL = "/login/"

@login_required #(login_url="/login/")
def comment_delete(request, id):

在重定向的URL里带有参数next,这个是指定的地址,我们可以读取这个参数,在登陆完成之后回到原视图继续执行操作

next=request.GET.get("next")
if next:
    return redirect(next)

有些视图并不是只有登录用户能看,但是有些内容只有登录了才可以操作,有很多方法可以实现对用户的区分,这儿我们通过is_authenticated进行处理。

在post_detail视图,我们可以执行发帖操作,这个只能登陆用户操作。
我们在post_detail和comment_thread函数里添加授权判断处理,只有用户已授权才能执行相应操作

if form.is_valid() and request.user.is_authenticated():

同时,我们在模板里用同样的方法关闭form显示,这post_detail.html和comment_thread.html的所有form窗口

{% if request.user.is_authenticated %}
<form method="post" action="">{% csrf_token %}
    {{comment_form|crispy}}
    <input type="submit" value="Post Comments" class="btn btn-default">
</form>
{% else %}
<p>You must login to post comment </p>
{% endif %}

至此,必须登陆之后我们才能发帖了