如何只允许一个用户看到 "UpdateView"?
How to allow only one User to see "UpdateView"?
我有一个 Users
和 Jobs
。如果某个User
创建了一个Job
,那么也只有这样he/she才能编辑这个Job
的一些信息。
所以他访问了 url .../job/update/<id>
。如果Job
是他创建的(User
是Job
中的ForeignKey
,那么他就可以修改数据,否则会报404
错误。
在 view
函数中,我可能会获取当前的 User
s id
并将此 id
与 Jobs
ForeignKey
进行比较。
但是 class views
中有很多模式和快捷方式,所以我很好奇如何以这种方式做到这一点。
class EditOrderView(UpdateView):
model = Job
fields = ['language_from','language_to','level','short_description','notes',
'text_to_translate','file']
template_name = 'auth/jobs/update-order.html'
class Job(models.Model):
customer = models.ForeignKey(User, related_name='orders', help_text=u"Zákazník")
translator = models.ForeignKey(User, related_name='jobs', null=True, blank=True, help_text=u"Prekladateľ")
price = models.FloatField(null=True, blank=True, help_text=u"Cena")
language_from = models.ForeignKey(Language, related_name='jobs_from', null=True)
language_to = models.ForeignKey(Language, related_name='jobs_to', null=True)
...
看来您可以覆盖 .get_object()
方法并包含您自己的逻辑:
from django.shortcuts import get_object_or_404
class EditOrderView(UpdateView):
model = Job
...
def get_object(self, queryset=None):
return get_object_or_404(self.model, pk=self.kwargs["pk"], customer=self.request.user)
我有一个 Users
和 Jobs
。如果某个User
创建了一个Job
,那么也只有这样he/she才能编辑这个Job
的一些信息。
所以他访问了 url .../job/update/<id>
。如果Job
是他创建的(User
是Job
中的ForeignKey
,那么他就可以修改数据,否则会报404
错误。
在 view
函数中,我可能会获取当前的 User
s id
并将此 id
与 Jobs
ForeignKey
进行比较。
但是 class views
中有很多模式和快捷方式,所以我很好奇如何以这种方式做到这一点。
class EditOrderView(UpdateView):
model = Job
fields = ['language_from','language_to','level','short_description','notes',
'text_to_translate','file']
template_name = 'auth/jobs/update-order.html'
class Job(models.Model):
customer = models.ForeignKey(User, related_name='orders', help_text=u"Zákazník")
translator = models.ForeignKey(User, related_name='jobs', null=True, blank=True, help_text=u"Prekladateľ")
price = models.FloatField(null=True, blank=True, help_text=u"Cena")
language_from = models.ForeignKey(Language, related_name='jobs_from', null=True)
language_to = models.ForeignKey(Language, related_name='jobs_to', null=True)
...
看来您可以覆盖 .get_object()
方法并包含您自己的逻辑:
from django.shortcuts import get_object_or_404
class EditOrderView(UpdateView):
model = Job
...
def get_object(self, queryset=None):
return get_object_or_404(self.model, pk=self.kwargs["pk"], customer=self.request.user)