Показывайте имя изображения в поле изображения в формах Django

У меня есть форма редактирования или обновления, в которой я хочу отображать только имя изображения в форме для лучшего пользовательского опыта, чтобы пользователь мог знать, какое изображение он загрузил при создании данных. Я храню имя изображения в модели, но хочу отображать имя изображения в поле image. forms.py

class MenuCategoryForm(forms.ModelForm):
    image = forms.ImageField(allow_empty_file=True, required=False)

    class Meta:
        model = MenuCategory
        fields = ['name', 'description', 'menu_options']

view

def menu_category_update(request, id):
    item = MenuCategory.objects.get(id=id)

    if request.method == 'POST':
        form = MenuCategoryForm(request.POST, request.FILES, instance=item)

        if form.is_valid():
            if request.FILES['image']:
                image = request.FILES['image']
                image_url = upload_image(image, 'menu_category', image.name)
                obj = form.save(commit=False)
                obj.image_url = image_url
                form.save()

            else:
                form.save()
            return redirect('menu-category')

    else:
        form = MenuCategoryForm(instance=item)

    context = {
        'form': form,
        'item': item
    }
    return render(request, 'menu/menu_category_update.html', context)

Для того, чтобы получить имя изображения в вашей форме, вам будет лучше использовать инициалы формы, например, так:


def menu_category_update(request, id):
    item = MenuCategory.objects.get(id=id)

    if request.method == 'POST':
        form = MenuCategoryForm(request.POST, request.FILES, instance=item)

        if form.is_valid():
            if request.FILES['image']:
                image = request.FILES['image']
                image_url = upload_image(image, 'menu_category', image.name)
                obj = form.save(commit=False)
                obj.image_url = image_url
                form.save()

            else:
                form.save()
            return redirect('menu-category')

    else:
        form = MenuCategoryForm(
                      initial={'image':item.image,
                                'name':item.name,})# this are the fields that we want to show in the form 

    context = {
        'form': form,
        'item': item
    }
    return render(request, 'menu/menu_category_update.html', context)

В вашей форме html вы примените инициалы формы к полю, которое вы хотите показать в вашей форме, сделав что-то вроде этого: form.initial.name Как я показал ниже :

{% extends 'partials/base.html' %} {% load crispy_forms_filters %} {% load
crispy_forms_tags %}
<!-- {% block title %}Menu category {% endblock %} -->
{% block content %}
<div class="container edit-form-flex">
  <div class="row Edit-form-box">
    <div class="form-inner-box bg-white">
      <div class="heading-editing">
        <h3>Edit menu category</h3>
      </div>

      <form method="POST" class="add-new-form edit-form" enctype="multipart/form-data">
        {% csrf_token %} {{ form.initial.name|crispy }}

        <div class="update-buttons-container">
          <button class="btn btn-info1" type="submit" value="Update">
            Update
          </button>
          <a class="btn btn-secondary" href="{% url 'menu-category' %}"
            >Cancel</a
          >
        </div>
      </form>
    </div>
  </div>
</div>

{% endblock %}
Вернуться на верх