2013-07-21 12 views
8

Di seguito è riportata una versione semplificata del codice django nel mio progetto; consente agli utenti di caricare un file e assegnargli un titolo. Questa funzione funziona perfettamente. Tuttavia, quando l'utente esegue nuovamente la modifica del modulo in un secondo momento, il file e il titolo vengono nuovamente visualizzati, ma quando l'utente va a inviare il file archiviato vuoti. Il campo del file del modulo riaperto per la modifica si presenta così:Modifica di un modello Django con un file file senza caricare nuovamente il file

Attualmente: media_location/uploadedfile.mp3

Cambio: [Scegliere File] Nessun file scelto

E dopo presento esso, è:

  • Questo Archiviato è richiesta

[Scegli file] Nessun file scelto

Come faccio a farlo in modo che l'utente non ha bisogno di ricaricare il file? Non mi importa se il campo è reso in sola lettura una volta che la presentazione è stata eseguita, o se rimane modificabile. Il progetto finito non è per un cliente e sarà disponibile solo per un piccolo gruppo di utenti fidati, ma mi piacerebbe comunque seguire le migliori pratiche se possibile. Grazie per qualsiasi aiuto.

Codice Django:

models.py

class Recording(models.Model): 
    rec_title=models.CharField(max_length=200,blank=True) 
    rec_file = models.FileField(upload_to='recordings') 

forms.py

from django import forms 
from songstorage.models import Recording 
class RecordingForm(forms.ModelForm): 
    rec_file=forms.FileField(label='Upload File') 
    rec_title=forms.CharField(label='Recording Title',required=False)  
    class Meta: 
     model=Recording 

views.py

def addrecordings(request,recordingfile): 
    #if there is a recordingfile in the url, the user is editing... 
    if recordingfile: 
     recording=Recording.objects.get(rec_title=recordingfile) 
     recording_form = RecordingForm(instance=recording) 
    #...Otherwise a new form is createing a new one 
    else: 
     recording_form = RecordingForm(request.POST, request.FILES) 

    #When the form is submitted, do the following: 
    if request.method == 'POST': 
     #check if its valid 
     if recording_form.is_valid(): 
      recording_form.save() 
      #if sucessfully submitted, redirect 
      return redirect('/recordings/') 
    return render_to_response('addrecordings.html',{'recording_form':recording_form},context_instance=RequestContext(request)) 
+1

Avere un problema simile, solo curioso di averlo già elaborato? –

+1

Penso che Django dovrebbe aggiungere una funzione per risolvere questo problema. –

risposta

0

ho avuto lo stesso problema e non riuscivo a capire come non in grado di cercare qualcosa di utile, la mia soluzione attuale è quella di utilizzare un altro modulo, nello scenario:

class RecordingUpdateForm(RecordingForm): 
    rec_file=forms.FileField(label='Upload File', required=False) 

L'unica differenza è che io sono utilizzando la vista basata sulla classe UpdateView, quindi è necessario modificare la funzione di visualizzazione per utilizzare lo RecordingUpdateForm per l'aggiornamento.

0

Ho avuto lo stesso problema.

È possibile sovrascrivere la funzione di pulizia predefinita di un modello. Questo convalida tutti i moduli, l'utente può modificare il file immagine in modifica e il file è garantito non vuoto.

class MyModel(models.Model): 
    image = models.ImageField(blank=True) 
    def clean(self, *args, **kwargs): 
    super(MyModel, self).clean(*args, **kwargs) 
    if not self.image: 
     raise ValidationError('Please provide an image') 
Problemi correlati