2010-08-31 8 views
8

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> 

Respuesta

5

Una cosa que noto es que el método de su acción es “addSeries”, pero en la forma que llamándolo "changeSeries".

En su ModelAdmin, usted debe tener una línea como la siguiente:

actions = ['addSeries'] 

Si esa es la línea que tiene, entonces usted necesita para cambiar:

<input type="hidden" name="action" value="changeSeries" /> 

a:

<input type="hidden" name="action" value="addSeries" /> 

Así es como el administrador de Django sabe qué acción fue seleccionada. Cuando tenga un formulario intermedio entre elegir la acción y realizar la acción, deberá conservar el nombre de la acción en el menú de selección en la interfaz de administración.

+0

¡Gracias! Eso hizo que todo funcionara perfectamente. – tjw

Cuestiones relacionadas