Ver Mensaje Individual
  #2 (permalink)  
Antiguo 29/08/2014, 21:26
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Llamar metodo de models en views

Si puedes llamar al método set_valor_inv dentro del template. Pero sinceramente no lo haría.

Primero vamos a revisar tu método.
Código Python:
Ver original
  1. def set_valor_inv(self):
  2.         self.valor_inv = self.existencia * self.precio_venta
  3.         self.save()
Primero calculas y asignas a valor_inv, excelente hasta aquí todo bien. De hecho aqui deberia de terminar el método, pero después guardas, eso significa hacer un query a la base de datos para guardar y segundo le estas asignando funcionalidad extra que no debería de ir ahí.

Hay un montón de maneras de hacer esto:
Primer manera:
Hacer un override del método save en tu modelo para que calcule el campo valor_inv antes de guardarlo.

Este comportamiento seria global y no abría forma de alterar valor_inv sin ir directo a la base de datos o cambiar los valores de existencia o precio_venta. Incluso en el admin este comportamiento seguiría igual.

Segunda manera:
Hacer un override del método save en cada uno de los formularios que vaya a modificar una instancia de tu modelo.

Lo malo es que lo vas a tener que reescribir eso por un montón de partes o crear algún mixin o hacer algo por el estilo. Pero tal vez haya formularios donde quieras modificar valor_inv con algún valor que tu le des. Incluso tendrías que añadir esto para el admin.

Tercera manera:
Usar signals, básicamente sería lo mismo que la segunda manera pero con signals en lugar de hacer el override.

Cuarta manera:
Tal vez el campo no te interesa tenerlo guardado, ya que siempre lo puedes calcular a través de existencia y precio_venta, no necesitas filtrar por ese campo, ordenar por ese campo. Solo te interesa mostrarlo y ya. En ese caso es mejor un campo calculado. Solo defines tu método y lo muestras en la plantilla.

Código Python:
Ver original
  1. @property
  2. def valor_inv(self):
  3.     return self.existencia * self.precio_venta

Quita manera:
Crear un middleware, que al pasar por el process_response, analice el response y veo si necesita efectuar algún cambio en las instancias que creaste.

En fin existen un montón de soluciones, cada de ellas con sus pros y sus contras.