Aquí podría ser tu PUBLICIDAD


Configuración del propietario del objeto con la vista genérica create_object en django

votos
10

¿Es posible usar create_object view para crear un nuevo objeto y asignar automáticamente request.user como clave externa?

EDUCACIÓN FÍSICA:

class Post(models.Model):
    text = models.TextField()
    author = models.ForeignKey(User)

Lo que quiero es usar create_object y fill author con request.user.

Publicado el 12/03/2009 a las 19:02
fuente por usuario Gonzalo Quero
En otros idiomas...        العربية       

5 respuestas

votos
3

Es posible que desee considerar un cierre.

from django.forms import ModelForm
from django.views.generic.create_update import create_object, update_object

def make_foo_form(request):
    class FooForm(ModelForm):
        class Meta:
            model = Foo
            fields = ['foo', 'bar']

        def save(self, commit=True):
            f = super(FooForm, self).save(commit=False)
            if not f.pk: f.user = request.user
            if commit: f.save()
            return f

    return FooForm

def create_foo(request):
    FooForm = make_foo_form(request)
    return create_object(form_class=FooForm)

Aquí hay algo de ineficiencia, ya que necesita crear el objeto ModelForm en cada solicitud, pero le permite inyectar funcionalidad en la vista genérica.

Debe decidir si la complejidad añadida para la creación de formularios vale la pena para mantener la simplicidad en el lado de la vista.

Un beneficio aquí, sin embargo, es que esto también funciona con el caso de actualización prácticamente sin ningún esfuerzo adicional:

def update_foo(request, object_id):
    FooForm = make_foo_form(request)
    return update_object(form_class=FooForm, object_id=object_id)

Obviamente, puede usar este enfoque para casos más complejos también.

Respondida el 01/12/2009 a las 11:21
fuente por usuario B. Slavin


Aquí podría ser tu PUBLICIDAD


votos
2

En muchos sentidos, todas las soluciones a esto serán más problemas de lo que valen. Este califica como un truco. Es posible que una actualización de django te deje en un estado alto si cambia la forma en que se implementa create_update. Por simplicidad, supondré que está tratando de establecer un usuario predeterminado, no forzar silenciosamente al usuario a ser el usuario que inició sesión.

Escribir un procesador de contexto:

from django.views.generic.create_update import get_model_and_form_class
def form_user_default(request):
    if request.method == 'GET':
        model, custom_form = get_model_and_form_class(Post,None)
        custom_form.author = request.user
        return {'form':custom_form}
    else: return {}

Lo que hará es anular el objeto de formulario que create_update pasa a la plantilla. Lo que está haciendo técnicamente es volver a crear el formulario después de que lo haya hecho la vista predeterminada.

Luego en tu url conf:

url(r'pattern_to_match', 'django.views.generic.create_update.create_object', kwargs={'context_processors':form_user_default})

De nuevo, tuve que profundizar en el código fuente para descubrir cómo hacer esto. En realidad, es mejor que intentes escribir tu propia vista (pero incorpora tantos objetos personalizados de Django como sea posible). No existe una forma "simple predeterminada" de hacerlo, porque en el paradigma django las formas están más estrechamente vinculadas a la capa modelo que a las vistas, y solo las vistas tienen conocimiento del objeto de solicitud.

Respondida el 12/03/2009 a las 09:22
fuente por usuario David Berger

votos
1

Si un usuario está autenticado, su objeto de usuario es el request.userobjeto.

No estoy familiarizado con create_object ... Todavía soy un principiante de django y acabo de comenzar mi primer proyecto real con él.

Tenga en cuenta que debe verificar que un usuario esté conectado antes de usar esto. Esto se puede hacer con request.user.is_authenticated().

Respondida el 12/03/2009 a las 08:08
fuente por usuario Powerlord

votos
0

Sugeriría hacer un contenedor para el create_object, ya que este autor sugiere http://www.b-list.org/weblog/2006/nov/16/django-tips-get-most-out-generic-views/ en la vista tendrá acceso a la información del usuario. Luego, deberá usar el extra_context para pasar al usuario a la plantilla. Finalmente, en la plantilla puede agregar un campo oculto con la información del usuario. No lo he intentado, pero lo he estado pensando durante bastante tiempo. Espero que esta solución te convenga! ;) ¡Salud!

Respondida el 27/04/2009 a las 06:23
fuente por usuario Andres

votos
0

No hay una buena manera de engancharse en el guardado de un objeto cuando se utilizan las vistas genéricas de Django actuales. Una vez que se vuelven a escribir como clases , podrá subclasificar la vista y enganchar en el lugar correcto sin tener que volver a escribir toda la vista.

Ya utilizo mis propias vistas genéricas basadas en clases por este motivo.

Respondida el 13/03/2009 a las 07:24
fuente por usuario Carl Meyer