with password extender custom contrib auth python django model user

python - password - Modelo limit_choices_to={''user'': user}



request.user django (6)

Fui a toda la documentación, también fui al canal de IRC (por cierto, una gran comunidad) y me dijeron que no es posible crear un modelo y limitar las opciones en un campo donde el ''usuario actual'' está en una ForeignKey. Trataré de explicar esto con un ejemplo:

class Project(models.Model): name = models.CharField(max_length=100) employees = models.ManyToManyField(Profile, limit_choices_to={''active'': ''1''}) class TimeWorked(models.Model): project = models.ForeignKey(Project, limit_choices_to={''user'': user}) hours = models.PositiveIntegerField()

Por supuesto, ese código no funciona porque no hay un objeto ''usuario'', pero esa era mi idea y yo estaba tratando de enviar el objeto ''usuario'' al modelo para limitar las opciones donde el usuario actual tiene proyectos, yo don No quiero ver proyectos en los que no estoy.

Muchas gracias si me pueden ayudar o darme algún consejo, no quiero que escriban toda la aplicación, solo un consejo sobre cómo lidiar con eso. Tengo 2 días con esto en mi cabeza y no puedo resolverlo :(

ACTUALIZACIÓN : la solución está aquí: http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/ enviando request.user a un modelo.



El modelo en sí mismo no sabe nada sobre el usuario actual, pero puede darle a este usuario una vista del formulario que opera los objetos de los modelos (y en las choices restablecimiento del formulario para el campo necesario).

Si necesita esto en el sitio de administración, puede probar raw_id_admin junto con django-granular-permissions ( http://code.google.com/p/django-granular-permissions/ pero no pude hacerlo funcionar rápidamente en mi django pero parece ser lo suficientemente fresco para 1.0, así que ...).

Por último, si realmente necesita una casilla de selección en el administrador, deberá piratear django.contrib.admin .


Esta limitación de opciones para el usuario actual es un tipo de validación que debe ocurrir dinámicamente en el ciclo de solicitud, no en la definición estática del Modelo.

En otras palabras: en el punto donde está creando una instancia de este modelo, estará en una Vista y en ese punto tendrá acceso al usuario actual y puede limitar las opciones.

Entonces solo necesita un ModelForm personalizado para pasar el request.user a, vea el ejemplo aquí: http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/

from datetime import datetime, timedelta from django import forms from mysite.models import Project, TimeWorked class TimeWorkedForm(forms.ModelForm): def __init__(self, user, *args, **kwargs): super(ProjectForm, self).__init__(*args, **kwargs) self.fields[''project''].queryset = Project.objects.filter(user=user) class Meta: model = TimeWorked

entonces en tu opinión:

def time_worked(request): form = TimeWorkedForm(request.user, request.POST or None) if form.is_valid(): obj = form.save() # redirect somewhere return render_to_response(''time_worked.html'', {''form'': form})


Hmmm, no entiendo completamente tu pregunta. Pero si no puede hacerlo cuando declara el modelo, tal vez pueda lograr lo mismo con los métodos de anulación de la clase de objetos donde "envía" el objeto del usuario, tal vez comience con el constructor.


No estoy seguro de entender completamente lo que quieres hacer, pero creo que hay muchas posibilidades de que obtengas al menos una parte del camino usando un Administrador personalizado . En particular, no intente definir sus modelos con restricciones para el usuario actual, sino que cree un administrador que solo devuelva objetos que coincidan con el usuario actual.


Use threadlocals si desea obtener el usuario actual que edita este modelo. El middleware Threadlocals coloca al usuario actual en una variable de todo el proceso. Toma este middleware

from threading import local _thread_locals = local() def get_current_user(): return getattr(getattr(_thread_locals, ''user'', None),''id'',None) class ThreadLocals(object): """Middleware that gets various objects from the request object and saves them in thread local storage.""" def process_request(self, request): _thread_locals.user = getattr(request, ''user'', None)

Consulte la documentación sobre cómo usar las clases de middleware. Luego, en cualquier parte del código, puedes llamar

user = threadlocals.get_current_user