1

目標は、upload_toを動的に更新して、ユーザーがアップロードしたファイルがユーザーに依存するディレクトリの場所に保存されるようにすることです。このオンラインの例はいくつかありますが、ModelFormを使用しているものはありません。2つの問題については、コードスニペットを参照してください。1つは、instance.user値の空の文字列を取得していることです。これを修正しようとすると、フォームが無効になります。

# models.py

def get_file_path( instance, filename ):
    # make the filepath include the signed in username
    print "inst: %s" % instance.__dict__.keys()
    print "inst:user:%s" % instance.user   # <-- This is empty string!!
    print "file: %s" % filename
    return "%s/myapp/%s/%s" % ( settings.MEDIA_ROOT, instance.user, filename )

class trimrcUpload(models.Model):
    user = models.CharField( max_length = 20 )
    inputFile = models.FileField( upload_to = get_file_path )


# forms. py

class trimrcUploadForm(ModelForm):

    class Meta:
        model = trimrcUpload
        exclude = ( 'resultFile', 'numTimesProcessed' )

# views.py

def myapp_upload( request, username, template_name="myapp/myapptemplate.html" ):

    dummy = trimrcUpload( user=username )
    if request.POST:
        form = trimrcUploadForm( request.POST, request.FILES, instance=dummy )
        if form.is_valid():
            success = form.save()
            success.save()

    # form is not valid, user is field is "required"
    # the user field is not displayed in the template by design,
    # it is to be populated by the view (above).

# http://docs.djangoproject.com/en/1.0/topics/forms/modelforms/
# about halfway down there is a "Note" section describing the use of dummy.
4

2 に答える 2

1

あなたの問題は、モデルのユーザー属性にユーザー名を入力しようとしたことに起因すると思います。アップロード フォームが常にログインしているユーザーによって使用される場合は、代わりにこれを使用できます。

dummy = trimrcUpload( user=request.user )

それ以外の場合でも、現在のようにユーザー名を渡したい場合は、次のようなことを試すことができます。

try:
    user = User.objects.get(username=username)
    dummy = trimrcUpload( user=user )
except User.DoesNotExist:
    # Probably have to set some kind of form error

ユーザー名をビューに渡す必要がないようにする最初のオプションを使用することをお勧めします。

于 2010-03-07T18:44:50.977 に答える
0

質問の元のコードは実際に機能します。

于 2010-03-07T18:59:11.233 に答える