2013-07-21 14 views
8

以下は、私のプロジェクトのdjangoコードを単純化したものです。ユーザーはファイルをアップロードしてタイトルを付けることができます。この機能は完全に機能します。ただし、後でユーザーがフォームを再編集すると、ファイルとタイトルが再表示されますが、ユーザーがファイルを提出すると空になります。現在ファイルを再アップロードせずにファイルフィールドでDjangoモデルを編集する

media_location/uploadedfile.mp3

変更:編集のためにリニューアルオープン形式のファイルフィールドには、次のようになります [ファイルを選択してください]いいえファイル選ばれた

そして、私がそれを提出した後、それはです:

  • この提出は

を必要とするユーザーがファイルを再アップロードする必要がないように、私はそれを得るにはどうすればよい

んが、ファイル選ば

を[ファイル]を選択しませんか]?いったん投稿が完了すると、フィールドが読み込み専用にされているのか、編集可能なままであるのかは私には関係ありません。完成したプロジェクトはクライアント用ではなく、少数の信頼できるユーザーだけが利用できますが、できる限りベストプラクティスに従いたいと考えています。助けてくれてありがとう。

ジャンゴコード:

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

似たような問題がありますが、あなたがまだそれを試してみましたか? –

+1

私はDjangoがこれを解決する機能を追加すべきだと思います。 –

答えて

0

私は同じ問題があったとも有益な何かを検索することができ、私の現在のソリューションは、あなたのシナリオでは、別のフォームを使用する方法を見つけ出すことができませんでした:

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

唯一の違いは、私はありますUpdateViewクラスベースのビューを使用しているため、更新のためにRecordingUpdateFormを使用するようにビュー関数を変更する必要があります。

0

私は同じ問題を抱えていました。

モデルのデフォルトクリーン機能を無効にすることができます。これにより、すべてのフォームが検証され、ユーザーは編集時にイメージファイルを変更でき、ファイルは空でないことが保証されます。

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') 
関連する問題