【问题标题】:Django forms : Edit image field (delete and show existing)Django 表单:编辑图像字段(删除并显示现有)
【发布时间】:2020-03-01 01:29:57
【问题描述】:

我正在尝试使用带有图像字段的 Django 模型表单,但我遇到了两个问题:

  1. 我不知道如何在输入中显示图像的当前名称
  2. 我不知道如何提供删除图像的方法

表格

class CityLogoForm(forms.ModelForm):
    logo = forms.ImageField(widget=forms.FileInput(attrs={'class': 'custom-file-input'}), required=False)

    class Meta:
        model = City
        fields = ['logo']

观看次数

def management_form_general(request, city_slug):
    city = City.objects.get(slug=city_slug)
    if request.method == 'POST':
        logo_form = CityLogoForm(request.POST, request.FILES,  instance=city)
        if logo_form.is_valid():
            logo_form.save()

    else:
        logo_form = CityLogoForm(instance=city)

    return render(request, 'management/form/city_general.html', {'city': city, 'logo_form': logo_form})

html

<form action="" enctype="multipart/form-data" method="post">
    <div class="form-group row">
        <label for="id_city" class="col-sm-2 col-form-label form_title">{{ logo_form.logo.label }}</label>
        <div class="custom-file">
            {{ logo_form.logo }}
            <label class="custom-file-label" for="{{ logo_form.logo.id_for_label }}" data-browse="Choisir Image">{{ logo_form.logo.label }}</label>
        </div>
    </div>
</form>

当用户上传内容时,我有一个脚本更改标签,但我找不到获取图像字段当前值的方法(对于正常的,它已正确预填充)。 由于它似乎没有预先填充输入,因此当输入为空时它似乎会被忽略,因此永远不会删除当前徽标。

编辑:如果可能,答案需要在 formset_factory 上的 for 循环中可行

【问题讨论】:

  • 您可以查看 django-admin 的功能。看看widget html & widget form field code的源代码
  • 的 src 中尝试{{ city.logo.url }} 进行展示
  • 嘿@YugandharChaudhari,谢谢,但是当我使用 formset_factory 时我该怎么办?执行 foo 循环时,我不会看到模型。正在寻找一种几乎每次都有效但似乎没有的方法

标签: django django-forms django-file-upload


【解决方案1】:

我不知道如何在输入中显示图像的当前名称

为您的模型添加一个属性,如果图像字段不为空,则返回图像文件名,例如:

import os

class MyModel(models.Model):

    image = models.ImageField(...)

    @property
    def image_name(self):
        return os.path.basename(self.image.path) if self.image else ''

然后在html模板中添加{{ your_model.image_name }}你需要显示当前图片名称的地方。

我不知道如何提供删除图像的方法

我最近遇到了同样的问题,我通过在 html 中添加一个隐藏的复选框 clear_image 来解决它(当用户单击清除图像按钮时使用 js 检查它),而不是我在 django 表单中处理接收到的值。

【讨论】:

  • 感谢您的回答,对于表单集,您将加载所有对象并将其传递给视图?
  • @BleuBizarre 为什么所有的对象?只有一个对象。
  • 我可能做错了所有事情,但是当我在模板中执行 formset_factory(模型或内联,等等)时,我有多个表单(带有 for 循环),但并不真正知道每个表单正在使用哪个对象跨度>
猜你喜欢
  • 2018-10-06
  • 2011-02-22
  • 2021-07-31
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
相关资源
最近更新 更多