Estoy interesado en crear una acción para la interfaz de administrador que requiera información adicional más allá de los elementos seleccionados. Mi ejemplo es agregar comics a una serie. (Sí, sé que la respuesta obvia es crear un esquema con relaciones X-to-X, pero desnudo conmigo por el simple ejemplo).Django: ¿Cómo crear una acción administrativa compleja que requiera información adicional?
En este ejemplo, he creado 100 comics. Después de que se crean, me gustaría asociarlos con un objeto de serie que ya se ha creado. Para ejecutar esta acción dentro del administrador, me gustaría seleccionar los elementos y luego iniciar la acción. Entonces me deberían preguntar qué objeto de serie usar (a través de una ventana emergente, formulario intermedio, etc.).
He seguido las instrucciones here que pretenden lograr esto a través de un formulario intermedio. Después de trabajar con él, ya no recibo más errores, pero la acción en sí misma tampoco se está ejecutando: el forloop nunca se ejecuta. En cambio, vuelve a la lista de comics del administrador con el mensaje: "No se seleccionó ninguna acción".
mi método admin.py:
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
def addSeries(self, request, queryset):
form = None
if 'cancel' in request.POST:
self.message_user(request, 'Canceled series linking.')
return
elif 'link_series' in request.POST:
form = self.SeriesForm(request.POST)
if form.is_valid():
series = form.cleaned_data['series']
for x in queryset:
y = Link(series = series, comic = x)
y.save()
self.message_user(request, self.categorySuccess.render(Context({'count':queryset.count(), 'series':series})))
return HttpResponseRedirect(request.get_full_path())
if not form:
form = self.SeriesForm(initial={'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME)})
return render_to_response('setSeries.html', {'comics': queryset, 'form': form, 'path':request.get_full_path()}, context_instance=RequestContext(request))
addSeries.short_description = 'Set Series'
Mi forma intermedia setSeries.html:
<!DOCTYPE html>
<html>
<head>
<title>Create Series Links</title>
</head>
<body>
<h1>Create Series Links</h1>
<p>Choose the series for the selected comic(s):</p>
<form method="post" action="{{ path }}">
<table>
{{ form }}
</table>
<p>
<input type="hidden" name="action" value="changeSeries" />
<input type="submit" name="cancel" value="Cancel" />
<input type="submit" name="link_series" value="link_series" />
</p>
</form>
<h2>This categorization will affect the following:</h2>
<ul>
{% for comic in comics %}
<li>{{ comic.title }}</li>
{% endfor %}
</ul>
</body>
</html>
¡Gracias! Eso hizo que todo funcionara perfectamente. – tjw