目标是动态更新upload_to,以便用户上传的文件存储在依赖于用户的目录位置。在线有几个例子,但没有一个使用ModelForm。请看两个问题的代码片段,一个是我为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.
答案 0 :(得分: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
我建议使用第一个选项,这样您就不必将用户名传递给视图。
答案 1 :(得分:0)
问题中的原始代码确实有效。