usuarios - tipos de usuario django
ActualizaciĆ³n de Django/Eliminar vista. Manejo de permisos de usuario (1)
models.py
class Punch(models.Model):
ro_number = models.IntegerField()
flag = models.FloatField(max_length=10)
actual = models.FloatField(max_length=10)
description = models.CharField(max_length=100, blank=True)
user = models.ForeignKey(User)
created_on = models.DateTimeField(auto_now_add=True)
def efficiency(self):
return ''%.2f'' % (float(self.flag)/float(self.actual)*100)
def __str__(self):
return str(self.ro_number)
urls.py
url(r''^flags/update/(?P<pk>[0-9]+)/$'', views.PunchEdit.as_view(), name=''update_flags''),
view.py
class PunchEdit(views.LoginRequiredMixin,
UpdateView,):
model = Punch
fields = [''ro_number'', ''flag'', ''actual'', ''description'']
template_name = ''free/home.html''
def get_success_url(self):
pass
Estoy tratando de descubrir cómo permitirles a los usuarios editar solo los objetos perforados que crearon. Cada vez que se crea un objeto Punch, se guarda qué usuario creó el golpe con una relación de clave externa. (Realizado en vistas no mostradas)
En este momento, si escribiera algo como mywebsite.com/punch/update/(pk)/, un usuario podría escribir en el pk de cualquier objeto de perforación y actualizar su información.
Entonces mi pregunta es ... ¿Cómo, al usar vistas genéricas de actualización / eliminación basadas en clases, puede evitar que un usuario toque un objeto de perforación que no crearon ellos mismos?
Puede verificar al usuario en el método .dispatch()
o en un middleware .process_request()
o crear una clase Permisos para ampliar sus vistas. Escribiré un breve ejemplo con la primera opción:
class PunchEdit(...):
def dispatch(self, request, *args, **kwargs):
# check for user logged in
...
# check for user permission:
# Take pk from kwargs
pk = kwargs.get(''pk'') # example
# Take user from request
user = request.user
# check permission
try:
Punch.objects.get(pk=pk, user=user)
return super(PunchEdit, self).dispatch(request, *args, **kwargs)
except Punch.DoesNotExist, e:
return HttpResponseForbidden()