validacion usuarios usuario tipos sesiones permisos manejo grupos agregar django django-models django-views django-class-based-views django-generic-views

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()

HttpResponseForbidden ()