2011-01-12 21 views
5

Ho il seguente modello:Come associare un'immagine a un modulo di modifica in Django?

class Listing(models.Model): 
    name = models.CharField(max_length=50, verbose_name="Title") 
    images = models.ManyToManyField('Image') 

, con il ManyToManyField collegamento con questa Image classe:

class Image(models.Model): 
    thumb = ImageField(upload_to='images/uploads/') 
    number = models.PositiveSmallIntegerField() 

e un corrispondente ModelForm in questo modo:

class ListingEditForm(ModelForm): 
    image1 = ImageField(required=False, label="Photo 1") 
    image2 = ImageField(required=False, label="Photo 2") 
    image3 = ImageField(required=False, label="Photo 3") 

    class Meta: 
     model = Listing 
     exclude = ('images') 

L'idea è quella di non limitare il numero di immagini che possono essere associate a un Listing nel ba ckend, ma in questo momento ho solo bisogno di 3 immagini nel modulo. Il caricamento delle immagini funziona correttamente, ma come procedere nel collegare il modulo a un'istanza Listing in modo che le immagini non siano "Nessuna" quando si visualizza il modulo di modifica?

Ovviamente, questo da solo non funziona, perché image1, image2 e image3 sono solo i campi del modulo, e non fa parte del modello:

form = forms.ListingEditForm(instance=listing) 

Quindi l'aggiunta di un dizionario come primo parametro sembra come l'ovvio cosa da fare:

form = forms.ListingEditForm({'image1': ...},instance=listing) 

ma quello che dovrebbe il valore di tale ... essere? E come posso recuperarlo dall'istanza Listing?

risposta

2

Risponderò alla mia domanda, anche se non è proprio la risposta che stavo cercando. Mi sono guardato intorno e, per quanto ne so, non esiste un modo affidabile in HTML per modificare il contenuto di un campo di input File. Quindi, potrei sbagliarmi, ma anche se invii queste informazioni con la richiesta, Django non avrà modo di mostrare le informazioni nel campo (poiché non corrisponde a un file sul PC locale).

Quindi, la mia soluzione è semplicemente di inviare gli URL delle immagini con la richiesta, come si farebbe normalmente:

return render_to_response('edit.html', {'image1': image1_url, ...}) 

Quindi, se questa informazione è presente, io uso jQuery per posizionare le immagini accanto il campo di inserimento file nel modello e aggiornarlo se l'utente seleziona un nuovo file. Non è il massimo, ma funziona.

Sarò comunque lieto di sentire altre soluzioni.

0

Vorrei utilizzare la relazione di chiave esterna in Immagine e inlineformset_factory per generare il modulo.

ListingEditForm = inlineformset_factory(Listing, Image, max_num=3, extra=0)

Vorrei anche aggiungere un'immagine campo del nome nel modello di immagine. In questo modo l'utente avrà l'indicazione dei file caricati nella visualizzazione del modulo, e sarà anche in grado di eliminare le immagini se lo desidera. Se hai bisogno di upload illimitati puoi semplicemente cambiare max_num a 0 ed extra a 1.

Ovviamente in questo modo non puoi associare un'immagine a più di un oggetto di Listato, ma se hai bisogno di un utente per poter cancellare le immagini che sono non raccomandato comunque.

Problemi correlati