Как обновить ImageField в Django? - PullRequest
1 голос
/ 07 августа 2020

Я новичок в Django. У меня проблема с обновлением ImageField.i имеет следующий код

в models.py

 class ImageModel(models.Model):
      image_name = models.CharField(max_length=50)
      image_color = models.CharField(max_length=50)
      image_document = models.ImageField(upload_to='product/')

-Это My forms.py

 class ImageForm(forms.ModelForm):
    class Meta:
        model = ImageModel
        fields = ['image_name', 'image_color' , 'image_document']

в Html файле (editproduct. html)

<form method="POST" action="/myapp/updateimage/{{ singleimagedata.id }}">
       {% csrf_token %}
        <input class="form-control" type="text" name="image_name" value="{{ singleimagedata.image_name}}">
        <input class="form-control" type="file" name="image_document">
        <button type="submit" class="btn btn-primary">UPDATE PRODUCT</button>
</form>

-myapp - это имя моего приложения. {{singleimagedata}} - это переменная, содержащая все полученные данные

-urls.py

urlpatterns = [
    path('productlist', views.productlist, name='productlist'),
    path('addproduct', views.addproduct, name='addproduct'),
    path('editimage/<int:id>', views.editimage, name='editimage'),
    path('updateimage/<int:id>', views.updateimage, name='updateimage'),
]

и вот My views.py

def productlist(request):
    if request.method == 'GET':
        imagedata = ImageModel.objects.all()
        return render(request,"product/productlist.html",{'imagedata':imagedata})

def addproduct(request):
    if request.method == 'POST':
        form = ImageForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            messages.add_message(request, messages.SUCCESS, 'Image Uploaded')
            return redirect('/myapp/productlist')
    else:
        imageform = ImageForm()
        return render(request, "product/addproduct.html", {'imageform': imageform})

def editimage(request, id):
    singleimagedata = ImageModel.objects.get(id=id)
    return render(request, 'product/editproduct.html', {'singleimagedata': singleimagedata})

def updateimage(request, id):  #this function is called when update data
    data = ImageModel.objects.get(id=id)
    form = ImageForm(request.POST,request.FILES,instance = data)
    if form.is_valid():
        form.save()
        return redirect("/myapp/productlist")
    else:
        return render(request, 'demo/editproduct.html', {'singleimagedata': data})
  • Мое изображение Загрузка работает нормально. Я не могу обновить изображение во время обновления данных. Остальные данные обновлены. Я не знаю, как обновить изображение и как удалить старое изображение и поместить новое изображение в каталог.

Ответы [ 4 ]

2 голосов
/ 07 августа 2020

Я думаю, вы пропустили enctype="multipart/form-data", попробуйте заменить:

<form method="POST" action="/myapp/updateimage/{{ singleimagedata.id }}">

на;

<form method="POST" enctype="multipart/form-data" action="{% url 'updateimage' id=singleimagedata.id %}">

Не упустите возможность добавить image_color поле для ввода html. Потому что в вашем случае модель поля image_color разработана как обязательное поле .

Чтобы удалить и обновить старый файл изображения из каталог;

import os
from django.conf import settings

# your imported module...


def updateimage(request, id):  #this function is called when update data
    old_image = ImageModel.objects.get(id=id)
    form = ImageForm(request.POST, request.FILES, instance=old_image)

    if form.is_valid():

        # deleting old uploaded image.
        image_path = old_image.image_document.path
        if os.path.exists(image_path):
            os.remove(image_path)

        # the `form.save` will also update your newest image & path.
        form.save()
        return redirect("/myapp/productlist")
    else:
        context = {'singleimagedata': old_image, 'form': form}
        return render(request, 'demo/editproduct.html', context)
0 голосов
/ 07 августа 2020

иногда что-то вроде кэшированного старого изображения не заменяется во внешнем интерфейсе, поэтому вам может потребоваться принудительно обновить sh, нажав CTRL + F5, или очистить историю просмотров.

ответ, данный @binpy, - это необходимое обновление, чтобы файлы были переданы в серверную часть.

0 голосов
/ 07 августа 2020

У меня была аналогичная проблема при обновлении profile_pi c пользователя. Я решил это с помощью следующего кода, который, я думаю, может помочь:

Models.py

class Profile(models.Model):
    # setting o2o field of user with User model
    user_name = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True)
    first_name = models.CharField(max_length=70, null=True, blank=True)
    last_name = models.CharField(max_length=70, null=True, blank=True)    
    profile_pic = models.ImageField(upload_to="images", blank=True, null=True,)


    def __str__(self):
        return str(self.user_name)

forms.py

class ProfileEditForm(ModelForm):
    class Meta:
        model = Profile
        fields = '__all__'
        # excluding user_name as it is a one_to_one relationship with User model
        exclude = ['user_name']

views.py

@login_required(login_url='login')
def edit_profile(request, id):
    username = get_object_or_404(Profile, id=id)
    extended_pro_edit_form = ProfileEditForm(instance=username)
    if request.method == "POST":
        extended_pro_edit_form = ProfileEditForm(request.POST, request.FILES, instance=username)
        if extended_pro_edit_form.is_valid():
            extended_pro_edit_form.save()
            next_ = request.POST.get('next', '/')
            return HttpResponseRedirect(next_)

    context = {'extended_pro_edit_form': extended_pro_edit_form}
    return render(request, 'edit_profile.html', context)

редактировать профиль. html

<form action="" method="post"
              enctype="multipart/form-data">
            {% csrf_token %}
            {{ extended_pro_edit_form.as_p }}
            {{ extended_pro_edit_form.errors }}
            <!--To redirect user to prvious page after post req-->
            <input type="hidden" name="next" value="{{ request.GET.next }}">

            <button type="submit">UPDATE</button>

        </form>
0 голосов
/ 07 августа 2020

Ответ от @binpy должен решить вашу проблему. В дополнение ко второму ответу вы можете:

def updateimage(request, id):  #this function is called when update data
    data = ImageModel.objects.get(id=id)
    form = ImageForm(request.POST,request.FILES,instance = data)
    if form.is_valid():
        data.image_document.delete()  # This will delete your old image
        form.save()
        return redirect("/myapp/productlist")
    else:
        return render(request, 'demo/editproduct.html', {'singleimagedata': data})

Проверить delete () метод в django документах.

...