I have a class-based view that is inherited by other views:
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
Now in my models.py file:
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')
The class EditAddressView works because the User field is explicitly called user, but the class EditLinkView does not because it requires instance.from_user instead of instance.user. (Let's just say I can't rename from_user).
What I'd like to do is to transform the instance.user != request.user part into a decorator where the syntax user is not required, but I can't figure out how to reference self.ThisModel.
At the same time, this allows me not to repeat the same method for both get and post.
Is what I want even possible?