2011-05-01 18 views
20

Este me está volviendo loco en este momento. No estaba sucediendo antes (incluso obtuve capturas de pantalla que tenía que hacer para el manual de usuario desde que el cliente lo requirió).Administrador de Django se cuelga (hasta el error de tiempo de espera) para un modelo específico al intentar editar/crear

Lo noté por primera vez en el servidor de producción y luego lo revisé y también sucede en el servidor de desarrollo que viene con Django. El modelo aparece en la página principal del administrador de django, puedo hacer clic en él y se mostrará la lista de puntos de venta. El problema viene cuando quiero editar una instancia existente o crear una nueva.

Simplemente hago clic en el enlace (o lo puse en la barra) y simplemente se cuelga.

class PointOfSaleAdmin(admin.ModelAdmin): 
    list_display = ('id','business', 'user', 'zipcode', 'address','date_registered') 
    list_filter = ('business',) 
    filter_horizontal = ('services',) 
admin.site.register(models.PointOfSale, PointOfSaleAdmin) 

Ese es el registro del modelo. Todos los modelos están registrados en la aplicación de administración y el usuario para probar que es un súper usuario. El modelo es:

class PointOfSale(models.Model): 
    user = models.ForeignKey(User) 
    zipcode = models.ForeignKey(Zipcode) 
    business = models.ForeignKey(Business) 
    services = models.ManyToManyField(Service, 
     verbose_name='available services') 
    date_registered = models.DateField(auto_now_add=True) 
    address = models.CharField(max_length=300) 

Además de algunos métodos que en realidad no deberían importar mucho. Además, la última vez antes de esto que probé el administrador fue justo después de crear todos esos métodos, por lo que no debería importar en esto.

El administrador muy rara vez tiene que acceder a esta página. Por lo general, solo enumera el PoS, pero todavía me molesta. ¿Alguna idea de por qué podría estar colgando? Todos los demás modelos funcionan bien.

Esto sucede tanto en Django 1.2.5 y 1.3

EDIT:

he modificado los límites de tiempo de espera. FUNCIONA, pero de alguna manera toma varios minutos que realmente suceda. Entonces, hay algo en el fondo que está demorando años. No entiendo cómo es que sucede sólo para este modelo y sucede en diferentes entornos (y con pequeños conjuntos de datos)


casi me siento como golpeando a mí mismo. Mi culpa por no dormir tanto tiempo.

El problema es que la lista de códigos postales es bastante grande (docenas de miles) y el campo de la clave externa se carga como una etiqueta de selección html, lo que significa que carga cada entrada. Es un problema con la cantidad de datos que hay simplemente.

Ahora me pregunto cómo controlar la forma en que se muestra la clave externa en el administrador. ¿Alguien podría ayudar con eso?

+1

Pregunta interesante con una respuesta interesante. He sido culpable de esto en el último mes: prueba tu aplicación con grandes conjuntos de datos, porque rastrear problemas como este no es obvio cuando crees que lo has probado todo. –

Respuesta

24

En el archivo admin.py, bajo la clase de administración apropiada, ajuste

raw_id_fields = ('zipcode',) 

Esto mostrará PK del código postal en lugar de una lista desplegable.

¿Hay algún motivo por el que esté configurando código postal como su propio modelo en lugar de usar un código de barras o un código postal real modelfield?

+1

Nunca los he usado para ser honestos. Aunque la razón por la que Usar código postal como modelo se debe a que obtuve todas las coordenadas (longitudes y latitudes) y lo estoy usando para mostrar (en un GMap) donde se encuentran los puntos de venta en todo Estados Unidos. ¡Gracias! – Mamsaac

+1

Lo suficiente. Solo quería asegurarme de que no hubiera habido una solución mejor. – spulec

+0

Por cierto, finalmente terminé usando algo de django_extension que proporciona autocompletar al administrador. Documentación horrible y no hizo exactamente lo que quería, pero modifiqué una gran parte del código y lo hizo comportarse derecho. – Mamsaac

0

¿Ha intentado consultar los registros de apache (si está utilizando obviamente apache) o cualquier otro registro relacionado con el servidor HTTP? Eso podría darte una idea de por dónde empezar.

¿Ese es el único modelo que se ve afectado? Mencionaste métodos en el modelo. Intente comentar esos métodos e intente nuevamente (incluido el método __unicode__), solo para ver si de alguna manera lo afectan. Reduzca todo al mínimo (en la medida de lo posible, obviamente), para tratar de deducir dónde comenzó la regresión.

Intente controlar los recursos del servidor cuando solicite esta página. ¿La CPU se dispara de manera espectacular? ¿Qué ocurre con la E/S de red? Podría ser un problema de base de datos (¿de alguna manera?).

Lo siento, esto realmente no responde su pregunta, pero esas son las primeras técnicas de depuración que intentaría intentar diagnosticar el problema.

+0

Revisé los registros. Estoy usando Apache/WSGI. No hay errores, excepto algunas advertencias de deprecation (pero vienen de Django y verifiqué que no están relacionadas con este problema). Tomé TODOS los atributos de administrador en todos los modelos (aviso, esto en el archivo admin.py) y lo intenté de nuevo sin éxito. Por lo tanto, estoy considerando que podría ser en models.py, pero no he encontrado nada sospechoso :(No hay picos de CPU, compré. Creo que debe ser un problema de DB de alguna manera, de hecho: S ¡Y muchas gracias! Revisaré más en el db – Mamsaac

+0

No recuerdo haberlo hecho, pero si cambié los modelos sin alterar manualmente la estructura de la tabla, ¿podría ser esa la fuente? – Mamsaac

5

Solo quería agregar que otra opción aquí es crear una lista read_only_fields. En los casos en que existe una relación con un modelo con una gran cantidad de opciones (en mi caso, una catalogación rel table marca entre una gran cantidad de usuarios e hilos de discusión) pero no es necesario editar el campo. Puede agregarlo a la lista read_only_fields solo imprimirá el valor en lugar de las opciones.

class FlaggedCommentsAdmin(ModelAdmin): 
    list_display = ('user', 'discussion', 'flagged_on') 
    readonly_fields = ('user', 'discussion') 
Cuestiones relacionadas