Как передать объект по идентификатору после сохранения из формы с помощью перенаправления?

#python-3.x #django #redirect #django-urls #django-url-reverse

#python-3.x #django #перенаправление #django-urls #django-url-обратный

Вопрос:

Извините, что спрашиваю об этом. Я описал сервис, который загружает изображение через форму. Суть в том, что после успешной загрузки (add_picture) я должен перейти на страницу изображения (picture_detail). Я не понимаю, почему я не могу передать идентификатор. Я сделал следующее:

models.py:

 class Picture(models.Model):
    url = models.URLField(blank=True, verbose_name='Ссылка на изображение')
    image = models.ImageField(upload_to='pictures/%Y/%m/%d', width_field='image_width', height_field='image_height',
                              blank=True, verbose_name='Изображение')

def get_absolute_url(self):
    return reverse('home:picture_detail', args=[self.id])
 

views.py:

 def add_picture(request, id=None):
    picture = Picture.objects.filter(is_active=True)
    # picture_form = None
    # picture = get_object_or_404(Picture, id=id)
    if request.method == 'POST':
        form = PictureCreateForm(data=request.POST, files=request.FILES)
                if form.is_valid():
        form.save()
        picture_id = form.save()
        request.session['id'] = picture_id.id
        id = request.session.get('id')
        return HttpResponseRedirect(reverse('home:picture_detail', kwargs={'id': id}))
        else:
            return render(request, 'add_picture.html', locals())
    else:
        form = PictureCreateForm()

    return render(request, 'add_picture.html', locals())
 

urls.py:

 urlpatterns = [
    path('', views.home, name='home'),
    path('add_picture/', views.add_picture, name='add_picture'),
    path('picture_detail/<int:id>/', views.picture_detail, name='picture_detail'),
]
 

Сообщение об ошибке

В результате я должен попасть на страницу такого рода:
Такая страница должна быть основана на идентификаторе после сохранения формы

Ответ №1:

Идентификатор может быть получен из результата form.save() :

 from django.shortcuts import redirect

# …

if form.is_valid():
    item = form.save()
    return redirect('home:picture_detail', id=item.id)
# … 

Ответ №2:

Ура! Мне удалось. Все, что было нужно, это передать идентификатор в сеанс. Я исправил свой код, и он работает. Посмотрите в views.py .