2011-12-16 9 views
6

Sto fraintendendo qualcosa! Se il mio modello non è stato salvato, non ha un ID associato. Quindi, se ho qualcosa di simile:l'istanza di un modello dà id = None Django

views.py (l'inserimento o la modifica di informazioni esistente utilizza la stessa 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(...) 

Ho anche un'immagine e utilizzare upload_to per l'ImageField. Ci sono due problemi: id è None e non sono sicuro di come manipolare/salvare lo instance=book in modo da ottenere effettivamente un ID. Il secondo problema è che la posizione in cui salvo i miei dati non è disponibile. Anche se il tag template book.img.url ha la posizione desiderata del libro a http:127.0.0.1:8000/folder1/media/id/, la posizione attuale è da qualche altra parte:

Dove voglio salvare la mia immagine a:

/project/folder1/media/id/ 

dove id è il libro id.

Quello che realmente ottenere:

/project/id/  

(Ma 'id' diventa 'None' dal momento che non esiste!)

Il mio codice precedente ha funzionato. Salverebbe nella posizione corretta, ma con questo codice attuale, non funziona. Quindi il problema del salvataggio non sembra essere dovuto a settings.py dato che ha funzionato in precedenza.

EDIT: rimosso non il codice dal codice formattazione zona

EDIT: ho scoperto il motivo per cui io non stavo salvando nella posizione corretta. Come si è scoperto, ho dimenticato di decommentare qualcosa quando ho modificato l'ultima volta settings.py. Salvare nella posizione funziona ora! Scusate ragazzi!

EDIT: Penso che id = Nessun problema è causato da form.save(). Se evito di farlo e salvo salvare direttamente il modello, non ho questo problema.

risposta

1

Per la prima 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() consente quindi utilizzare per save_book come l'istanza salvata BookModel e save_book.id è la sua identificazione.

+0

Grazie! Sì, ho provato qualcosa di simile. Sta ancora creando la cartella None, ma questa volta sta anche creando la cartella id. Ad esempio, se faccio 'save_book.img.save ('img', request.FILES ['img'])', l'img verrà salvata in/None e/1. – sharkfin

4

Id assegna solo al salvataggio di oggetti quando si utilizza il campo ID autoincrement (predefinito). È possibile salvare l'elemento prima di gestire l'immagine, quindi salvare l'immagine.

Può essere che non ci si possa preoccupare del nome dell'immagine perché gli archivi di file django non presentano problemi con gli stessi nomi di immagine. Quindi, se si salva il file "image.png", e quindi salvare un altro file con il nome "image.png" - allora sarà salvato come "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

Grazie. Mi piace il modo in cui hai gestito le cose condizionali (copiare quello stile, eh heh). Ma ottengo ancora 'None' per id ... Penso che potrebbe essere quando il modulo salva che sta causando il problema di Nessuno. Sono tornato al mio vecchio codice, quindi funziona per ora. – sharkfin

0

def create_id (esempio, some_id = Nessuno):

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 (mittente, esempio, * args, ** kwargs):

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

pre_save.connect (pre_save_post_receiver, sender = Post)

+0

Si prega di formattare il codice e aggiungere una breve spiegazione. –

Problemi correlati