Перенаправление формы Django с помощью HttpResponseRedirect
Так что это не может быть слишком сложно, но я не могу понять...
Я хочу, чтобы моя форма в django (находится по адресу / file_upload/) чтобы загрузить файл, добавьте его в базу данных, а затем перенаправьте на новую страницу, где параметром является идентификатор поля, которое я добавил в базу данных (находится по адресу / file / 163/, скажем).
Я настроил urls.py так что / file / 163/ работает просто отлично, если вы ориентируетесь там напрямую, но я не знаю, как получить там от / file / upload/.
мой код выглядит так:
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]))
Я не могу использовать данное решение потому что я не знаю, какой идентификатор поля будет, пока я не обработал форму в views.py, поэтому перенаправление должно произойти в views.py - ... Я думаю.
какие мысли?
4 ответов
ваш вид с формой должен выглядеть примерно так:
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,
})
у вас есть аргументы reverse
неправильно в
return HttpResponseRedirect(reverse('/file/', args=[my_file.id]))
reverse
принимает представление или имя или представление, а не url.
вы не говорите, что ваша функция просмотра называется для просмотра файла, но давайте скажем, что он называется view
, тогда выше должно быть
return HttpResponseRedirect(reverse('view', args=[my_file.id]))
или, может быть,
return HttpResponseRedirect(reverse(view, args=[my_file.id]))
в зависимости от того, что вы написали в urls.py
вы можете назвать в вид urls.py
и используйте эти имена вместо функции имена- дополнительные примеры см. В документации
использование реверса-хорошая идея, если вам нравится тасовать свой urls.py
вокруг - вы сможете изменить любой из путей и все ваши взгляды будут просто продолжать работать.
или вы можете использовать просто 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)
или использование позиционных аргументов, если это требуется для определения url:
my_file = FileField.objects.create() return redirect('file', file_id=my_file.pk)
- путем передачи родственник, абсолютный, или полный URL-адрес:
my_file = FileField.objects.create() return redirect('/files/%i/' % my_file.pk)
Мне кажется, что вы хотите достичь именно того, что объясняет учебник Django, шаг за шагом. Если у вас есть время, проверьте это:Django Учебникhttps://docs.djangoproject.com/en/1.6/intro/tutorial03/