2013-07-21 12 views
8

Poniżej znajduje się uproszczona wersja kodu django w moim projekcie; pozwala użytkownikom przesłać plik i nadać mu tytuł. Ta funkcja działa idealnie. Jednak, gdy użytkownik ponownie zmieni formularz, plik i tytuł są wyświetlane ponownie, ale gdy użytkownik pójdzie do przesłania plików opróżnione. Pole plik formularza ponownie otwarty do edycji wygląda tak:Edycja modelu Django za pomocą pola plików bez ponownego wczytywania pliku

Obecnie: media_location/uploadedfile.mp3

Zmiana: [Wybierz plik] Bez pliku Wybrana

I po przesłaniu go:

  • Ten Zapisano jest wymagane

[Wybierz plik] Bez pliku Wybrana

Jak mogę to tak, że użytkownik nie musi ponownie przesłać plik? Nie ma dla mnie znaczenia, czy pole zostanie zrobione tylko raz, czy zostało ono poddane edycji, czy też pozostaje edytowalne. Gotowy projekt nie jest przeznaczony dla klienta i będzie dostępny tylko dla małej grupy zaufanych użytkowników, ale w miarę możliwości nadal będę postępować zgodnie ze sprawdzonymi metodami. Dzięki za pomoc.

kod 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

Masz podobny problem, po prostu ciekawy, czy już to opracowałeś? –

+1

Myślę, że Django powinien dodać funkcję, aby rozwiązać ten problem. –

Odpowiedz

0

miałem ten sam problem i nie mógł dowiedzieć się, w jaki sposób, ani w stanie wyszukać coś pożytecznego, mój obecny rozwiązaniem jest użycie innej formie, w scenariuszu:

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

Jedyna różnica jest taka, że ​​jestem przy użyciu widoku opartego na klasie UpdateView, dlatego należy zmodyfikować funkcję widoku, aby zaktualizować ją za pomocą RecordingUpdateForm.

0

Miałem ten sam problem.

Można zastąpić domyślną funkcję czyszczenia modelu. Potwierdza to wszystkie formularze, użytkownik może zmienić plik obrazu podczas edycji, a plik jest gwarantowany jako niepusty.

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')