目前,我打算写一个用户可以撰写博客文章的网站。我还没有开始实施,因为我是Django的新手,想要了解如何解决问题并构建整个项目。
我的问题: 用户不得使用Django的管理页面(/ admin)。用户只应与我写的网站进行互动。
我网站上的用户可以创建博客帖子。现在,我必须确保只有博客文章的创建者才能够编辑/删除自己的帖子。所有其他用户应该只能阅读这篇文章。
所以,我需要每个用户/实例的权限。我知道有一些像django-guardian这样的全面许可系统,但我更愿意自己解决它。还要更好地理解Django框架。
我已经阅读过Django文档了,但我不知所措。
我想这是一个常见的问题,我也有一个解决这个问题的常见方法。有人可以帮助我在哪里看,从哪里开始?
到目前为止我的想法(请发表评论):
创建类似blog/5/edit
的页面,只有创建博客文章号5
的用户才能访问该页面。这应该很容易在视图功能中,对吗?在此页面上有一个用于编辑博客文章的表单。
这个视图(伪代码!)
if request.user != blogpost.user:
redirect/error page
else:
show Form/process Form
这样安全吗?到目前为止,我在搜索互联网时还没有找到这样的解决方案。然而,自发地,作为Django的初学者,我认为这已经足够了。
答案 0 :(得分:0)
是的,你可以这样做。为此,我建议创建一个自定义装饰器,如下所示:
decorators.py
:
from django.core.exceptions import PermissionDenied
from .models import YourBlogPostModel
def user_is_blog_post_user(function):
def wrap(request, *args, **kwargs):
post = YourBlogPostModel.objects.get(pk=kwargs['blog_post_id'])
if post.user == request.user:
return function(request, *args, **kwargs)
else:
raise PermissionDenied
wrap.__doc__ = function.__doc__
wrap.__name__ = function.__name__
return wrap
然后,您可以将其与其他装饰器一起使用。
views.py
:
@login_required
@user_is_blog_post_user
def function_based_view(request, blog_post_id):
# ...
请查看here以获取更详细的说明。
如果您使用的是CVB
,则可以创建自己的Mixin
或decorate the class。
class UserIsBlogPostAdmin(object):
"""Verify that the current user is the user of the blog post."""
def dispatch(self, request, *args, **kwargs):
blog_post = get_object_or_404(YourBlogPostModel, pk=args[0])
if blog_post.user != request.user
raise Http404
return super().dispatch(request, *args, **kwargs)