Перенаправление формы 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) функция быстрого доступа:

  1. путем передачи объекта модели (если определен метод get_absolute_url модели), поэтому в вашем случае:

    my_file = FileField.objects.create()
    return redirect(my_file)
  2. передавая имя представления и некоторые позиционные и ключевые аргументы, в вашем случае:

    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)
  3. путем передачи родственник, абсолютный, или полный URL-адрес:
    my_file = FileField.objects.create()
    return redirect('/files/%i/' % my_file.pk)

Мне кажется, что вы хотите достичь именно того, что объясняет учебник Django, шаг за шагом. Если у вас есть время, проверьте это:Django Учебникhttps://docs.djangoproject.com/en/1.6/intro/tutorial03/