2009-03-12 18 views

Respuesta

2

De muchas maneras, 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 esto va a hacer 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 su conf url:

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

Una vez más, tuve que profundizar en el código fuente para encontrar la manera de 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.

1

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

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 asegurarse de que un usuario inicie sesión antes de usar esto. Esto se puede hacer con request.user.is_authenticated().

+0

Lo sé (gracias de todos modos;)). Lo que trato de hacer es usar una vista genérica para esto, así no tengo que escribir el código para guardar el nuevo objeto. El código de Django se prueba a fondo, así que, siempre que sea posible, prefiero usarlo en lugar de mi propio código. –

0

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

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

0

Yo sugeriría hacer un contenedor para el create_object, como este autor sugiere http://www.b-list.org/weblog/2006/nov/16/django-tips-get-most-out-generic-views/ en la vista que tendrá acceso a la información del usuario. Después, necesitará 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!

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) 

Hay una cierta ineficiencia aquí, ya que se necesita para crear el objeto ModelForm en cada petición, pero sí permite que se inyecte funcionalidad en la vista genérica.

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

Una ventaja aquí, sin embargo, es que esto también funciona con el caso de actualización con prácticamente 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 utilizar este enfoque para los casos más complejos.

Cuestiones relacionadas