簡體   English   中英

使用Django中類變量的基於類的視圖的裝飾器

[英]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

同時,這使我不必對getpost重復相同的方法。

我想要的甚至有可能嗎?

您可以使用另一個類屬性來存儲用戶字段的名稱,然后使用get_attr來獲取方法中的值。

如果要避免在getpost重復代碼,則可以將通用代碼分解為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM