在Django中编辑之前检查记录所有者

时间:2019-11-28 11:09:13

标签: python django python-3.x django-views

我正在学习Django,但是它挂在一个看似简单的时刻。我需要检查并允许用户仅编辑他的帖子,并且如果他单击链接来编辑其他人的链接,则呈现特定页面。

我无法形成用户验证的条件,请帮助:

views.py

@login_required
def blogs_edit_text_post(request, post_id):
    post_form = PostForm(instance=TextPost.objects.get(id=post_id))
    owner = TextPost.objects.get(pk=1)

    if request.user == owner:
        if request.method == "POST":
            post_form = PostForm(request.POST, instance=TextPost.objects.get(id=post_id))

            if post_form.is_valid():
                post = post_form.save()
                return redirect(blogs_blog)

        return render(request, 'blogs/edit_text_post.html', {
            'post_form': post_form
        })
    else:
        return render(request, 'blogs/error_page.html', {})

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile_user_id')
    blog_title = models.CharField(max_length=300, verbose_name='Название блога')
    blog_description = models.TextField(max_length=500, verbose_name='Пара слов о себе', blank=True)
    profile_pic = models.ImageField(default='nophoto.jpg', upload_to='user_pics/', blank=True, verbose_name='Аватар')


class TextPost(models.Model):
    author = models.ForeignKey(Profile, on_delete=models.CASCADE)
    title = models.CharField(max_length=300, verbose_name='Заголовок')
    post = models.TextField(max_length=500, verbose_name='Текст поста', blank=False)
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

urls.py

path('blogs/blog/', views.blogs_blog, name='blogs-blog')

1 个答案:

答案 0 :(得分:0)

请注意以下几点:

  1. 不要将TextPost与Profile模型关联,而应将其直接与User模型关联。对于您的项目,这将更加容易。

  2. 始终在OneToOneField或ForeignKeyField中使用“ related_name”。

  3. 始终使用上下文(或另一个命名变量)在模板中传递变量。在大型项目中,您将必须传递许多变量。

models.py

const Data = {
    DistrictData: [{
        "id": "1",
        "name": "ss 1",
        "cid": "1"
      }, {
        "id": "2",
        "name": "ss 2",
        "cid": "1"
      }, {
        "id": "3",
        "name": "ss 3",
        "cid": "1"
      }
    ]
}

views.py

class TextPost(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_name') # User, not Profiel, related_name added
    title = models.CharField(max_length=300, verbose_name='Заголовок')
    post = models.TextField(max_length=500, verbose_name='Текст поста', blank=False)
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)