views.py
class EditPost(UserPassesTestMixin, LoginRequiredMixin, UpdateView):
model = Posts
form_class = PostForm
template_name="posts/add_post.html"
def test_func(self):
x = self.request.user.pk
print (x)
y = Posts.objects.get(user='user')
print (y)
if x == y:
return True
else:
if self.request.user.is_authenticated():
raise Http404("You are not allowed to edit this Post")
models.py
class Posts(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
post = models.CharField(max_length=1200, blank=False)
如何匹配登录用户和帖子的用户对象
我找不到任何解决方案,因为我使用的是基于类的视图。
答案 0 :(得分:1)
签入test_func
非常棘手。您需要在test_func
中获取一次对象以检查是否允许用户使用它,然后由同一个fiew再次获取该对象。
更简单的方法是覆盖get_queryset
方法。如果用户不是帖子的作者,他们将获得404。
class EditPost(LoginRequiredMixin, UpdateView):
def get_queryset(self):
return super(EditPost, self).filter(user=self.request.user)
答案 1 :(得分:1)
试试这个:
将调度添加到EditPost类
def dispatch(self, request, *args, **kwargs):
obj = self.get_object()
if obj.user != self.request.user:
return Http404("You are not allowed to edit this Post")
return super(EditPost, self).dispatch(request, *args, **kwargs)
答案 2 :(得分:1)
要添加到以前的帖子中,请尝试以下操作:
添加到您的班级EditPost:
login_url = 'your url name or path to login page'
def test_func(self):
obj = self.get_object()
return obj.author == self.request.user
test_func
使用UserPassesTestMixin
方法来实现此特定逻辑。要覆盖它,我们使用obj
将变量get.object()
设置为视图返回的当前对象。
之后,如果当前对象(obj.author
)上的作者与当前用户(self.request.user
)相匹配,则允许进行编辑。如果不是这样(即false
),我们会抛出一个错误。
login_url
来自LoginRequiredMixin
,默认位置为/accounts/login
。要覆盖它,请设置您自己的路径或登录模板的名称。这样会将那些尚未登录到登录页面的人带走。