2011-12-16 10 views
6

¡Estoy entendiendo mal algo! Si mi modelo no se guarda, no tiene una identificación asociada. Así que si tengo algo como esto:instancia de formulario de un modelo da id = Ninguna Django

views.py (insertar o editar la información de los actuales usos del mismo ModelForm)

def insert_or_modify(request, id=None): 
    if id is not None: 
     book = BookModel.objects.get(pk=id) 
    else: 
     book = BookModel() 

    if request.method == 'POST': 
     form = BookInfoForm(request.POST, request.FILES, instance=book) 
     if form.is_valid(): 
      form.save() 

    .... 

    return render_to_response(...) 

también tengo una imagen y utilizar upload_to para la ImageField. Hay dos problemas: id es None y no estoy seguro de cómo manipular/guardar el instance=book para que realmente obtenga una identificación. El segundo problema es que la ubicación donde guardo mis datos está muy lejos. A pesar de que la etiqueta de plantilla book.img.url tiene la ubicación deseada del libro en http:127.0.0.1:8000/folder1/media/id/, la ubicación real está en otra parte:

Donde quiero salvar mi imagen en:

/project/folder1/media/id/ 

donde id es el identificador de libro.

Lo que realmente sale:

/project/id/  

(Pero 'id' se convierte en 'Ninguno', ya que no existe!)

Mi código anterior funcione. Se guardaría en la ubicación correcta, pero con este código actual, no funciona. Entonces, el problema del ahorro no parece deberse a settings.py, ya que funcionó previamente.

EDIT: no elimina el código de área de código de formateo

EDIT: descubrí por qué yo no estaba salvando a la ubicación correcta. Resultó que olvidé descomentar algo la última vez que modifiqué settings.py. ¡Guardar en la ubicación funciona ahora! ¡Lo siento chicos!

EDIT: Creo que el problema id = None es causado por form.save(). Si evito hacerlo y solo guardo el modelo directamente, no tengo este problema.

Respuesta

1

Para la primera parte:

def insert_or_modify(request, id=None): 
    if id: 
     book = BookModel.objects.get(pk=id) 
     if request.method == 'POST': 
      form = BookInfoForm(request.POST, request.FILES, instance=book) 
      if form.is_valid(): 
       save_book = form.save() 
       # use save_book as your instance of BookModel 
     .... 
    else: 
     if request.method == 'POST': 
      form = BookInfoForm(request.POST, request.FILES) 
      if form.is_valid(): 
       save_book = form.save() 
       # use save_book as your instance of BookModel 
     .... 

save_book = form.save() permite entonces que usted utilice save_book que la instancia salvado de BookModel y save_book.id es su identificación.

+0

Gracias! Sí, intenté algo como esto. Todavía está creando la carpeta None, pero esta vez también está creando la carpeta id. Por ejemplo, si hago 'save_book.img.save ('img', request.FILES ['img'])', la img se guardará en/None y/1. – sharkfin

4

Id asigna solo al guardar objetos cuando usa el campo de identificación de autoincrement (predeterminado). Puede guardar el artículo antes de manejar la imagen y luego guardar la imagen.

Puede ser que no se preocupe por el nombre de la imagen - porque los almacenamientos de archivos django no tienen problemas con los mismos nombres de imagen. Así que si usted acaba de guardar archivo "image.png", y luego guardar otro archivo con el nombre "image.png" - a continuación, se guarda como "image_1.png"

def add_or_create(request, item_id=None): 
    item = get_object_or_404(BookModel, id=item_id) if item_id else None 
    form = BookInfoForm(request.POST or None, request.FILES or None, instance=book) # assume it is ModelForm 

    if form.is_valid(): 
     book = form.save() 
+1

Gracias. Me gusta la forma en que manejas las cosas condicionales (voy a copiar ese estilo, je je). Pero todavía obtengo 'Ninguno' para la identificación ... Creo que puede ser cuando el formulario guarda que está causando el problema Ninguno. Volví a mi código anterior, así que funciona por ahora. – sharkfin

0

create_id def (ejemplo, some_id = Ninguno):

if some_id is None: 
    obj=Post.objects.first() 
    new_id=obj.id 
    new_id+=1 
    return new_id 
else: 
    return some_id 

def pre_save_post_receiver (remitente, instancia, * args, ** kwargs):

if not instance.id: 
    instance.id = create_id(instance) 

pre_save.connect (pre_save_post_receiver, sender = Post)

+0

Formatee su código y agregue una breve explicación. –

Cuestiones relacionadas