所以这不会太难,但我无法弄明白......
我希望我的表单在django(位于 / file_upload / )上传文件,将其添加到数据库,然后重定向到新页面,其中参数是字段的id我在数据库中添加了(位于 / file / 163 / ,比如说)。
我已经设置了urls.py,以便 / file / 163 / 在您直接导航时工作正常,但我不知道如何从 /文件到达那里/上传/
我的代码是这样的:
def add(request):
if request.method == 'POST': # If the form has been submitted...
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
# do stuff & add to database
my_file = FileField.objects.create()
return HttpResponseRedirect(reverse('/file/', args=[my_file.id]))
我无法使用this solution,因为在我处理views.py中的表单之前,我不知道字段ID是什么,因此重定向必须发生在views.py中。我想。
有什么想法吗?
答案 0 :(得分:20)
中有
reverse
错误的参数
return HttpResponseRedirect(reverse('/file/', args=[my_file.id]))
reverse
获取视图或名称或视图,而不是网址。
你没有说你的视图函数被调用什么来查看文件,但是假设它被称为view
,那么上面应该是
return HttpResponseRedirect(reverse('view', args=[my_file.id]))
或者
return HttpResponseRedirect(reverse(view, args=[my_file.id]))
具体取决于您在urls.py中所写的内容
您可以在urls.py
中命名视图并使用这些名称而不是函数名称 - see the documentation for more examples
如果你喜欢改变你的urls.py
,那么使用反向是一个好主意 - 你将能够改变任何路径,你的所有观点都会继续工作。
答案 1 :(得分:10)
您对表单的看法应如下所示:
def add(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
# do stuff & add to database
my_file = FileField.objects.create()
# use my_file.pk or whatever attribute of FileField your id is based on
return HttpResponseRedirect('/files/%i/' % my_file.pk)
else:
form = UploadFileForm()
return render_to_response('upload_file.html', {
'form': form,
})
答案 2 :(得分:1)
或者您只需使用redirect(to[, permanent=False], *args, **kwargs)
快捷键功能:
通过传递一个模型对象(如果定义了模型的get_absolute_url方法),那么在你的情况下:
my_file = FileField.objects.create()
return redirect(my_file)
通过传递视图名称和一些位置和关键字参数,在您的情况下:
my_file = FileField.objects.create()
return redirect('file', my_file.pk)
或使用位置参数,如果您的网址定义需要它:
my_file = FileField.objects.create()
return redirect('file', file_id=my_file.pk)
my_file = FileField.objects.create()
return redirect('/files/%i/' % my_file.pk)
答案 3 :(得分:0)
在我看来,你想要实现的是Django Tutorial正在逐步解释的内容。如果您有时间,请查看:Django Tutorial https://docs.djangoproject.com/en/1.6/intro/tutorial03/