[英]Decorators for class-based views that use class variables in Django
我有一個由其他視圖繼承的基於類的視圖:
class EditProfileAttribute(View):
template_name = 'mytemplate.html'
ThisModel = models.Model
def get(request, model_id):
instance = self.ThisModel.objects.get(id=model_id)
if instance.user != request.user:
return HttpResponseForbidden("Forbidden.")
# add form here
return render(request, self.template_name, {'model_id':model_id})
def post(request, model_id):
instance = self.ThisModel.objects.get(id=model_id)
if instance.user != request.user:
return HttpResponseForbidden("Forbidden.")
# do some editing here, save forms, etc.
return HttpResponse("Edited")
class EditAddressView(EditProfileAttributeView):
ThisModel = Address
class EditLinkView(EditProfileAttributeView):
ThisModel = Link
現在在我的models.py文件中:
class Address(models.Model):
user = models.ForeignKey(User)
address = models.TextField(max_length=100)
class Link(models.Model):
from_user = models.ForeignKey(User, related_name='from_link')
to_user = models.ForeignKey(User, related_name='to_link')
之類的EditAddressView
起作用,是因為User字段被顯式地稱為user
,但是EditLinkView
的類EditLinkView
是因為它需要instance.from_user
而不是instance.user
。 (讓我們說我不能重命名from_user
)。
我想做的是將instance.user != request.user
部分轉換為不需要語法user
的裝飾器,但我不知道如何引用self.ThisModel
。
同時,這使我不必對get
和post
重復相同的方法。
我想要的甚至有可能嗎?
您可以使用另一個類屬性來存儲用戶字段的名稱,然后使用get_attr
來獲取方法中的值。
如果要避免在get
和post
重復代碼,則可以將通用代碼分解為helper方法,或者改寫dispatch
。
class EditProfileAttribute(View):
ThisModel = models.Model
user_field_name = 'user'
def dispatch(self, request, *args, **kwargs):
self.instance = self.ThisModel.objects.get(id=kwargs['model_id'])
if getattr(self.instance, self.user_field_name) != request.user:
return HttpResponseForbidden("Forbidden.")
# calling super() will call get() or post() as appropriate
return super(EditProfileAttribute, self).dispatch(request, *args, **kwargs)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.