用户只能修改自己的帖子是如何实现的?


可不可以访问post/xx/edit时
views里判断当前登录用户名与post/xx的作者是否相同
然后做不同的跳转?

  • 8 条回复 | 4 人参与
  • 现在就是简单地在视图中判断,最优雅的方式是使用权限系统。

  • @追梦人物 我看了一些文章 但permission有个地方我没明白
    就是允许的行为是在哪定义的
    比如

    //新建一个权限
    content_type = ContentType.objects.get(app_label='school', model='Discussion')
    permission = Permission.objects.create(codename='can_publish',
                                           name='Can Publish Discussions',
                                           content_type=content_type)
    //给某个user添加权限
    user.user_permissions.add(permission)
    

    user就有了can_publish的权限 那Django 怎么知道can_publish是干嘛的?

  • 好像想歪了..
    应该是权限只起个选择作用,剩下的自己写。

    @permission_required('can_publish')
    def can_publish(request):
        pass
    
  • @呵呵哒的猫 我的实现方式很简单的,只要在模板判断文章是否属于当前请求者,像这样:

    {% if request.user == post.author %}
             <a href="{% url 'forum:edit_post' post.id %}" style="margin-left:10px">
              <span  class="glyphicon glyphicon-edit"></span>
               <small>编辑</small>
               </a>
    {% endif %}
    
  • @呵呵哒的猫

    这是views.py

    @login_required
    def edit_post(request, post_id):
        post = get_object_or_404(Post, id=post_id)
        if request.method != 'POST':
            form = PostForm(instance=post)
        else:
            form = PostForm(instance=post, data=request.POST)
            if form.is_valid():
                form.save()
                return HttpResponseRedirect(reverse('users:profile', args=[post.author.id]))
    
        context = {'post': post, 'form': form}
        return render(request, 'forum/post/edit_post.html', context)
    
  • @sunmouren 你这么写不行的

    登录的用户可以直接通过url访问修改任意文章

    http://www.sunmouren.xin/edit_post/1/

    没有起到权限控制的作用

  • @呵呵哒的猫 有道理,不过这个也可以通过在views.py 中判断一下post.user和 request.user是不是一致来解决。

  • 装饰器,非常好用

添加一条新回复
登录 或者 注册 后发表回复