Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 在多用户应用程序中,检查当前博客文章是否属于登录用户,并根据需要提供url建议_Django_Url_Authentication_Autosuggest - Fatal编程技术网

Django 在多用户应用程序中,检查当前博客文章是否属于登录用户,并根据需要提供url建议

Django 在多用户应用程序中,检查当前博客文章是否属于登录用户,并根据需要提供url建议,django,url,authentication,autosuggest,Django,Url,Authentication,Autosuggest,新手提示:我有以下代码。我的博客应用程序是一个多用户应用程序。一旦任何用户创建了帖子并访问了他/她的个人资料,他们应该只看到自己的帖子,这很简单 post_id是post模型的主键,它会自动递增。多用户应用程序的问题在于,用户可能会尝试放置不属于自己的东西。我正试图抓住这个问题。过一段时间后,他们会发现他们的post\u id并没有增加,有些是“丢失的”,因为它们属于其他人 在url中显示帖子的主键以获取它并在edit\u post查看它是否属于用户是一个好主意吗 有没有比在url中显示主键更

新手提示:我有以下代码。我的博客应用程序是一个多用户应用程序。一旦任何用户创建了帖子并访问了他/她的个人资料,他们应该只看到自己的帖子,这很简单

post_id
是post模型的主键,它会自动递增。多用户应用程序的问题在于,用户可能会尝试放置不属于自己的东西。我正试图抓住这个问题。过一段时间后,他们会发现他们的
post\u id
并没有增加,有些是“丢失的”,因为它们属于其他人

  • 在url中显示帖子的主键以获取它并在
    edit\u post
    查看它是否属于用户是一个好主意吗
  • 有没有比在url中显示主键更好的建议
  • 如果当前的
    post\u id
    不在url中,并且我相信我需要
    post\u id
    来获取用户想要编辑的当前帖子,那么我如何才能获取该帖子
url.py views.py
在your views.py中,可以使用以下内容:

@login_required 
def edit_post (request, post_id):
    post = None
    if post_id:
        post = get_object_or_404(Post, pk=post_id)
        if post.user != request.user:
            return HttpResponse("You can only edit your own posts")

    if request.method == 'POST': 
        post_form = PostForm(request.POST, instance=post) 
        if post_form.is_valid():
            post_form.save()
            return HttpResponse("Sucess")
    else: 
        post_form = PostForm(instance=post) 

    return render_to_response('edit.html', {'post_form':post_form })  
from django.shortcuts import get_object_or_404

@login_required 
def edit_post (request, post_id):
    post = get_object_or_404(Post, pk=post_id, user=request.user)
...

在your views.py中,可以使用以下内容:

@login_required 
def edit_post (request, post_id):
    post = None
    if post_id:
        post = get_object_or_404(Post, pk=post_id)
        if post.user != request.user:
            return HttpResponse("You can only edit your own posts")

    if request.method == 'POST': 
        post_form = PostForm(request.POST, instance=post) 
        if post_form.is_valid():
            post_form.save()
            return HttpResponse("Sucess")
    else: 
        post_form = PostForm(instance=post) 

    return render_to_response('edit.html', {'post_form':post_form })  
from django.shortcuts import get_object_or_404

@login_required 
def edit_post (request, post_id):
    post = get_object_or_404(Post, pk=post_id, user=request.user)
...
在url中显示帖子的pk以获取它并在edit_post视图中检查它是否属于用户是一个好主意吗

您绝对应该在编辑视图中检查帖子的所有权

有没有比在url中显示主键更好的建议

还有其他选择:例如,id实际上不需要是唯一的——只是每个用户的id都是唯一的。您可以拥有一个为每个用户递增的id,而不是全局递增的id。就我个人而言,我不知道这是否值得这么麻烦。我认为使用主键是可以的,只要你能保证它的安全,而且你不在乎人们是否能通过查看来推断你的音量

如果当前帖子id不在url中,并且我相信我需要帖子id来获取用户想要编辑的当前帖子,那么我如何才能获取当前帖子id

正如我所说,您可以与用户一起查找另一列,或者甚至可以为每篇文章创建随机ID(例如截断的UUID)

对于编辑视图,只需执行以下操作即可确保其安全:

@login_required 
def edit_post (request, post_id):
    post = None
    if post_id:
        post = get_object_or_404(Post, pk=post_id)
        if post.user != request.user:
            return HttpResponse("You can only edit your own posts")

    if request.method == 'POST': 
        post_form = PostForm(request.POST, instance=post) 
        if post_form.is_valid():
            post_form.save()
            return HttpResponse("Sucess")
    else: 
        post_form = PostForm(instance=post) 

    return render_to_response('edit.html', {'post_form':post_form })  
from django.shortcuts import get_object_or_404

@login_required 
def edit_post (request, post_id):
    post = get_object_or_404(Post, pk=post_id, user=request.user)
...
在url中显示帖子的pk以获取它并在edit_post视图中检查它是否属于用户是一个好主意吗

您绝对应该在编辑视图中检查帖子的所有权

有没有比在url中显示主键更好的建议

还有其他选择:例如,id实际上不需要是唯一的——只是每个用户的id都是唯一的。您可以拥有一个为每个用户递增的id,而不是全局递增的id。就我个人而言,我不知道这是否值得这么麻烦。我认为使用主键是可以的,只要你能保证它的安全,而且你不在乎人们是否能通过查看来推断你的音量

如果当前帖子id不在url中,并且我相信我需要帖子id来获取用户想要编辑的当前帖子,那么我如何才能获取当前帖子id

正如我所说,您可以与用户一起查找另一列,或者甚至可以为每篇文章创建随机ID(例如截断的UUID)

对于编辑视图,只需执行以下操作即可确保其安全:

@login_required 
def edit_post (request, post_id):
    post = None
    if post_id:
        post = get_object_or_404(Post, pk=post_id)
        if post.user != request.user:
            return HttpResponse("You can only edit your own posts")

    if request.method == 'POST': 
        post_form = PostForm(request.POST, instance=post) 
        if post_form.is_valid():
            post_form.save()
            return HttpResponse("Sucess")
    else: 
        post_form = PostForm(instance=post) 

    return render_to_response('edit.html', {'post_form':post_form })  
from django.shortcuts import get_object_or_404

@login_required 
def edit_post (request, post_id):
    post = get_object_or_404(Post, pk=post_id, user=request.user)
...

您的用例非常适合。此包已经实现了每个对象的权限,并且有一个名为get\u objects\u的函数用于\u user,其工作方式如下:

from django.shortcuts import render_to_response
from django.template import RequestContext
from projects.models import Project
from guardian.shortcuts import get_objects_for_user

def user_dashboard(request, template_name='projects/dashboard.html'):
 projects = get_objects_for_user(request.user, 'projects.view_project')
 return render_to_response(template_name, {'projects': projects},
    RequestContext(request))

正如您所看到的,这个例子几乎就是您所需要的,但是对于帖子来说。

您的用例非常适合您。此包已经实现了每个对象的权限,并且有一个名为get\u objects\u的函数用于\u user,其工作方式如下:

from django.shortcuts import render_to_response
from django.template import RequestContext
from projects.models import Project
from guardian.shortcuts import get_objects_for_user

def user_dashboard(request, template_name='projects/dashboard.html'):
 projects = get_objects_for_user(request.user, 'projects.view_project')
 return render_to_response(template_name, {'projects': projects},
    RequestContext(request))

正如您所看到的,这个例子几乎就是您所需要的,但是对于帖子来说。

谢谢,这非常有帮助。你可以在这里看到一个例子,谢谢,这非常有帮助。你可以在这里看到一个例子