I have a generic_inlineformset_factory instance being rendered via a
bound form so that users can modify an existing object.
The form renders OK, except for the File and Image fields, which show
up as empty. The CharFields in the same models have their correct
values. If I try to save the form, I get "IndexError: list index out
of range", being called in "C:\Python25\lib\site-packages\django\db
\models\query.py", line 146, in __getitem__: return list(qs)[0], which
tracing it back to my code is called from:
imagen_formset = ImagenInlineFormSet(request.POST, request.FILES,
prefix="imagen", instance=pub)
The same basic code and the exact same template work just fine for
creating a new object, just not for editing an existing one.
Code:
-------------------------
models.py
class Publicacion(BaseModel):
(...)
imagenes = generic.GenericRelation(Imagen)
archivos = generic.GenericRelation(Archivo)
class Imagen(InlineModel):
imagen = models.ImageField(upload_to="uploads/imagenes")
nombre = models.CharField(max_length=200)
class Archivo(InlineModel):
"""(Archivo description)"""
archivo = models.FileField(upload_to="uploads/archivos")
nombre = models.CharField(max_length=200)
descripcion = models.TextField(blank=True)
fecha_subida = models.DateField(auto_now_add=True)
publicar_desde = models.DateField(blank=True, null=True)
publicar_hasta = models.DateField(blank=True, null=True)
-------------------------
forms.py
class PublicacionForm(ModelForm):
class Meta:
model = Publicacion
fields = ['titulo', 'abstract', 'publicado_en',
'fecha_de_publicacion', 'autores_secundarios',
'autores_secundarios_2']
ImagenInlineFormSet = generic_inlineformset_factory(Imagen, extra=3,
can_delete=False, exclude=["visible"])
ArchivoInlineFormSet = generic_inlineformset_factory(Archivo, extra=3,
can_delete=False, exclude=
["visible",'publicar_desde','publicar_hasta'])
-------------------------
views.py
@login_required
def publicacion_editar(request, id):
pub = Publicacion.objects.get(id=id)
if request.method == "POST":
form = PublicacionForm(request.POST, request.FILES)
if form.is_valid():
pub=form.save()
message = "Hemos guardado sus cambios"
imagen_formset = ImagenInlineFormSet(request.POST,
request.FILES, prefix="imagen", instance=pub)
if imagen_formset.is_valid():
imagen_formset.save()
archivo_formset = ArchivoInlineFormSet(request.POST,
request.FILES, prefix="archivo", instance=pub)
if archivo_formset.is_valid():
archivo_formset.save()
return HttpResponseRedirect(pub.get_absolute_url())
else:
form = PublicacionForm(instance=pub)
imagen_formset = ImagenInlineFormSet(prefix="imagen")
archivo_formset = ArchivoInlineFormSet(prefix="archivo")
titulo = "Modificar publicación"
return render_to_response('core/publicacion_crear.html', common
(locals()))
------------
core/publicacion_crear.html
{% if form %}
<form action="." method="post" accept-
charset="utf-8" id="publicacion_crear" enctype="multipart/form-data">
<table>
{{ form }}
<tr><td colspan="2"><hr/></tr>
{{ imagen_formset }}
<tr><td colspan="2"><hr/></tr>
{{ archivo_formset }}
<tr><td>
<td><input type="submit" value="{{ titulo }} →"></p>
</tr></table>
</form>
{% endif %}
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-users?hl=.