Загрузить изображение в неправильный каталог в django ImageField - PullRequest
1 голос
/ 04 июня 2019

Когда я загружаю фотографию, фотография загружается успешно, , но фотография помещается в неправильный каталог.

Вместо размещения изображения на пути к 'media/posts-pics/' - как я обрисовал в своей модели Post - оно размещается на пути 'media'.

Это мои файлы:

models.py

class Post(models.Model): 
    index_pic = models.ImageField(upload_to='posts-pics/')

Project.urls.py

if settings.DEBUG: 
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

views.py

def add_post(request):
    if request.method == "POST":
        form = AddPostForm(request.POST, request.FILES)
        if form.is_valid():
            new_post = form.save(commit=False)
            new_post.index_pic = form.cleaned_data['index_pic']
            new_post.save()

            return redirect('view_post')

    else:
        form = AddPostForm()
    template = 'post/add_edit_post.html'
    context = {'form': form}
    return render(request, template, context)


def edit_post(request, slug):
    post = get_object_or_404(Post, slug=slug)

    if request.method == "POST":
        form = AddPostForm(request.POST, request.FILES, instance=post)
        if form.is_valid():
            Post.objects.filter(id=post.id).update(title=request.POST['title'],
                                                   index_pic=form.cleaned_data['index_pic'],
                                                   )

            return redirect('view_post')
    else:

        form = AddPostForm(instance=post)
    template = 'post/add_edit_post.html'
    context = {'form': form}
    return render(request, template, context)

Я использовал точно такой же код для add_post, и фотография была на своем месте, но у меня возникли проблемы в edit_post. что не так?

Примечание:

Технически я могу удалить 'media/post-pics', но это делается с помощью Специальное назначение и цель: каждое приложение имеет свою папку для сохранение изображений.

1 Ответ

1 голос
/ 04 июня 2019

Проблема в том, что вы неправильно используете ModelForm.

В представлении edit_post вы хотите заменить это:

Post.objects.filter(id=post.id).update(
    title=request.POST['title'],                                                   
    index_pic=form.cleaned_data['index_pic'],
    )

простым простым:

 form.save()

, который позаботится об обновлении сообщения, переданного как form.instance (с использованием очищенных данных, что не относится к вашему текущему коду)

FWIW, в вашем add_postвид, вы также хотите заменить этот

        new_post = form.save(commit=False)
        new_post.index_pic = form.cleaned_data['index_pic']
        new_post.save()

простым простым:

        new_post = form.save()

Еще раз, весь смысл ModelForms в том, что они знают, как создавать и обновлять экземпляры модели.

...