django - filtros - ¿Es posible crear una vista de administrador personalizada sin un modelo detrás?
filtros django (3)
La respuesta más directa es "no". Como dice el Libro de Django, el administrador es para "Usuarios de confianza que editan contenido estructurado", en este caso el contenido estructurado son modelos organizados en jerarquías y configurados a través de settings.py. Y lo que es más importante, si su objeto no se inclina por completo a un modelo. Modelo completo con relaciones esperadas, el administrador probablemente lanzará excepciones por todas partes.
Sin embargo, como dice el mantra, "es sólo python". Puede anular cualquiera de las páginas en admin. Simplemente cree sus propias plantillas en su proyecto y haga que aparezcan primero en la búsqueda de plantillas. Además, al heredar admin / base.html, mantiene la apariencia del proyecto de administración.
Escriba su vista administrativa y plantillas para este objeto, como cualquier otro, pero asegúrese de envolver las vistas en el decorador is_staff para garantizar que las vistas estén protegidas del acceso de usuarios no autorizados. Póngalos en la aplicación, tal vez en admin / views.py, con templates / admin / object_list.html y object_form.html.
Una vez que tenga las herramientas administrativas adecuadas para estos objetos que no pertenecen a la base de datos, puede proporcionarles acceso a través de la página de índice de administración: desea anular admin / index.html y proporcionar elementos adicionales específicos del proyecto a la página según sea necesario.
He hecho exactamente esto para proporcionar acceso administrativo a las API de terceros que almacenan nuestros datos, como el servicio de correo electrónico ConstantContact, y funciona bastante bien.
Tengo un objeto que quiero usar en admin en lugar de un modelo que hereda los modelos. Modelo. Si lo hago heredar modelos. Modelo, este objeto creará una tabla en la base de datos que no quiero. Solo quiero que este objeto se quede en la memoria.
Una solución a la que he llegado con la ayuda de la gente agradable en el desbordamiento de pila es crear vistas de administrador, registrar estas vistas personalizadas mediante un modelAdmin (admin.site.register ()) en admin.py y usar este objeto similar a un modelo como datos dinámicos. almacenamiento (en memoria).
Dado que este modelo como objeto no se hereda de los modelos.Modelo, admin.site.register () (bajo admin.py) no lo acepta y muestra un error de "tipo ''no es iterable" cuando intento acceder a él en el navegador.
Puede agregar sus vistas directamente al objeto AdminSite
, en lugar de a cualquier subclase ModelAdmin
particular que luego registre.
Se accede al AdminSite predeterminado a través de django.contrib.admin.site
, que es a lo que llama registrarse y autodiscover. En lugar de usar esto, puede crear su propia subclase y agregarle sus propias vistas , y luego registrar sus modelos en lugar de la predeterminada.
hmmm Gracias por su ayuda a todos. La solución que he encontrado (con su ayuda de curso :) es la siguiente:
Tengo dos plantillas personalizadas:
my_model_list.html
my_model_detail.html
Bajo views.py:
class MyModel(object):
# ... Access other models
# ... process / normalise data
# ... store data
@staff_member_required
def my_model_list_view(request) #show list of all objects
#. . . create objects of MyModel . . .
#. . . call their processing methods . . .
#. . . store in context variable . . .
r = render_to_response(''admin/myapp/my_model_list.html'', context, RequestContext(request))
return HttpResponse(r)
@staff_member_required
def my_model_detail_view(request, row_id) # Shows one row (all values in the object) in detail
#. . . create object of MyModel . . .
#. . . call it''s methods . . .
#. . . store in context variable . . .
r = render_to_response(''admin/myapp/my_model_detail.html'', context, RequestContext(request))
return HttpResponse(r)
Bajo el django urls.py principal:
urlpatterns = patterns(
'''',
(r''^admin/myapp/mymodel/$'', my_model_list_view),
(r''^admin/myapp/mymodel/(/d+)/$'', my_model_detail_view),
( r''^admin/'', include( admin.site.urls ) )
)