2010-11-07 8 views
6

Digamos que estoy usando la aplicación django-tagging y decido que quiero agregar una clase de formulario a los formularios de etiquetado existentes. No quiero parchar el formulario en el forms.py existente, ya que se apagará cuando se actualice. ¿Cómo amplío forms.py para incluir mi clase de formulario?¿Cómo se puede extender una aplicación django conectable?

Intenté agregar una carpeta de "etiquetado" en mi aplicación con un forms.py que solo incluía mi clase, pero que rompe las clases de formulario de la aplicación instalada. (Sé que era una posibilidad remota, solo pensé en intentarlo).

¿Alguna sugerencia sobre dónde buscar información sobre cómo agregar una clase de formulario a una aplicación existente?

+0

Realizar pedido [Modificando/ampliando aplicaciones django de terceros] (http://stackoverflow.com/a/8442736/2698552) – ChillarAnand

Respuesta

2

Jacob Kaplan-Moss, el desarrollador original de Django, answers your question in the abstract (ya que su pregunta era abstracta en primer lugar) en las páginas 185 a 203 de su presentación, "Django en el mundo real".

Sin embargo, para que se aplique ese consejo, el desarrollador del complemento debe haber escrito su aplicación de acuerdo con las directrices.

+0

Gracias por la información, en realidad estoy sorprendido de que no haya una manera de hacer esto De la caja. Creo que crearé una nueva aplicación con un formulario que use los modelos, etc. de la aplicación enchufable instalada. – chris

+1

Me encantarían algunas fuentes más. Esa presentación es de 500 clics demasiado tiempo. – jozxyqk

+0

Enlace directo a la diapositiva 185 -> http://www.slideshare.net/jacobian/django-in-the-real-world-1750000/185 –

4

La respuesta simple es heredar de las clases de formulario, crear sus propias modificaciones y usar su versión modificada.

Así, en lugar de importarlos desde Taggit, se podría importar desde su propia forms.py

he hecho esto muchas veces cuando quiero decorar/mejorar la funcionalidad de una aplicación existente. La desventaja es que si la documentación es deficiente, debe buscar en la fuente para averiguar cuál es la pila de llamadas y el árbol de herencia para la funcionalidad que desea modificar.

La desventaja de este enfoque es que no puede modificar el comportamiento de la aplicación contribuida. Entonces, si desea alguna funcionalidad interna de taggit para usar su código personalizado, esto es difícil de implementar. Sin embargo, este es un caso muy raro.

Si realmente quieres hacer eso (como tuve que hacer una vez), puedes clonar la fuente y mantener tu propia copia. Crea una rama con tus modificaciones y asegúrate de escribir buenas pruebas.

A continuación, debe agregar este código a su proyecto django como su propia aplicación; debido a las reglas de búsqueda de Python, encontrará su copia local y la usará en lugar de la del directorio global de paquetes de sitio.

Si se actualiza el upstream, su carga es entonces mantener su copia asegurándose de que las pruebas no fallen cuando actualiza/rebase.

+0

En el caso general, lo obvio es crear una aplicación django local, es decir [ 'startapp'] (https://docs.djangoproject.com/en/dev/intro/tutorial01/), heredando lo que quieres y agregando características, pero me parece que conseguir que django use tu código de aplicaciones en lugar del heredado depende de la aplicación base ¿Podría explicar las posibles formas en que django podría usar una aplicación después de agregarla a 'INSTALLED_APPS', por ejemplo a través de' urls.py', y cómo podría enganchar su aplicación en su lugar? ¿Hay solo un punto de entrada y tienes que modificar cada bit de código en la línea para llegar al bit que deseas cambiar? – jozxyqk

+0

[comentarios django] (https://docs.djangoproject.com/en/1.4/ref/contrib/comments/custom /) proporciona 'COMMENTS_APP' y espera' get_model'/'get_form' en' __init __. Py', que desde mi punto de vista oculta la interacción entre django y la aplicación. Si esto no se proporcionó, ¿existe una forma estándar de reemplazar un formulario por el mío, por ejemplo? – jozxyqk

Cuestiones relacionadas