2011-02-07 6 views
6

En mi sitio Django 1.2.4, me gustaría dirigir al usuario a una página de administración que se completa previamente con algunos valores, en función de los datos actuales con los que están trabajando. Por ejemplo:Administrador de Django: rellenando previamente los valores de POST o GET?

{% for person in people %} 
    <tr> 
     <td>{{person}}</td> 
     <td><a href='admin/foo/bar/add?name={{person}}'>Create a foo for {{person}}</td> 
    </tr> 
{% endfor %} 

Entonces, cuando el usuario hace clic en el enlace, el campo name se rellena previamente con el valor {{person}}.

¿La interfaz de administración de Django admite hacer esto? Los formularios de administración de Django usan POST, pero no estoy seguro de cómo agregar datos de POST a una solicitud de la plantilla.

O bien, podría establecer variables GET, luego usar JavaScript personalizado en el formulario para establecer los valores correspondientes.

Respuesta

10

De acuerdo con el código fuente (y una prueba rápida), Django admite el uso de parámetros GET como valores iniciales para formas de modelo en el administrador. Incluso admite relaciones de muchos a muchos.

¿Has probado esto? Tal vez es la barra que falta al final de la url.

admin/foo/bar/add?name=Foobar 

Probablemente se le redirecciona a ...

admin/foo/bar/add/ 

... por lo tanto pierde la cadena de consulta. Intenta agregar una barra allí y ver si funciona.

admin/foo/bar/add/?name={{ person }} 

Update (Prerrellenado campos booleanos)

Sólo en caso de que alguien más está teniendo problemas con el llenado previo campos booleanos:

Si pasa algún valor en la cadena de consulta, p.ej admin/foo/bar/add/?is_active=foo, esto rellenará el campo is_active con verdadero (ya que cualquier cadena no vacía es un valor verdadero). Por lo tanto, si desea "desactivar" una casilla de verificación para un campo dado, pasar ningún valor, como admin/foo/bar/add/?is_active=


Este es un fragmento del código del método add_view en ModelAdmin responsable de usar parámetros GET como valores iniciales. http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L878

# Prepare the dict of initial data from the request. 
# We have to special-case M2Ms as a list of comma-separated PKs. 
initial = dict(request.GET.items()) 
for k in initial: 
    try: 
     f = opts.get_field(k) 
    except models.FieldDoesNotExist: 
     continue 
    if isinstance(f, models.ManyToManyField): 
     initial[k] = initial[k].split(",") 

form = ModelForm(initial=initial) 
Cuestiones relacionadas