首页 > 解决方案 > Django - 如何捕获和记录选定的图像

问题描述

我正在尝试使用可视界面过滤掉不适当的图像。不适当的图像是主观的,这就是为什么我希望用户只选择适当的图像(一次选择多个)并在选择完成后按“完成”。用户的输入应存储在类似于以下的数据库中:

user_x = image1, image2, image4 ......
user_y = image6, image2, image3 ......
.
.

这是它目前的样子:图像过滤

我是 Django 的完全初学者,我不知道该怎么做。任何帮助将不胜感激。


filter.html (显示图像的模板)

   <div class="container-fluid my-container">

        {% filter_images_normal 3 as images %}

        <div class="row no-pad display-flex  my-row">
            {% for image in images %}
                <div class="col-xl-4 col-lg-4 col-md-4 col-sm-4 col- my-col my-col-xl-4 col-lg-4 col-md-4 col-sm-4 col-4 my-col">
                    <input class="img-thumbnail" type="image" id="image" alt="Image" src="{{ MEDIA_URL}}{{ image }}">
                </div>
            {% endfor %}
        </div>

        <button type="button" class="btn btn-primary btn-lg btn-block">Finish</button>
    </div>

filter_images.py (从文件夹中选择不同的随机图像的模板标签)

@register.simple_tag
def filter_images_normal(count=3):
    valid_extensions = ('.jpg', '.jpeg', '.png', '.gif')
    rand_dir = '/static/app_filter/images/normal/'
    path = '/app_filter/static/app_filter/images/normal/'

    files = [f for f in os.listdir(settings.BASE_DIR + path)
             if f[f.rfind("."):] in valid_extensions]

    # print(random.sample(files, count))
    print(rand_dir)
    return [rand_dir + filename for filename in random.sample(files, count)]

模型.py

class Normal(models.Model):
    appropriate_images_normal = models.TextField(max_length=30)

视图.py

def pickfeel_filter_normal(request):
    return render(request, "app_filter/filter-normal.html")

标签: pythondjangoimage

解决方案


以用户友好的方式执行此操作的唯一方法是使用 javascript:

  • 在 Django 方面,这是一个简单FormMultipleChoiceField选项,其中选择需要反映您向用户显示的图像。这些值需要是唯一可识别的值,以便您知道选择了哪个图像并将其映射回实际文件。
  • 在您的视图中为图像创建选项(不使用模板标签),并将图像在您的上下文中作为选项传递给您的表单字段。
  • 在您的模板中,将此表单字段呈现为隐藏状态。它将是<select>多个设置为 true 的字段。接下来,使用<img>标签而不是标签来渲染您的图像<input>
  • 使用 javascript,检测用户何时单击任何图像并做两件事: 1. 切换选择指示器以向用户显示图像是否被选中。<select>2. 从选定的选项中添加/删除图像。

这样,当提交表单时,唯一重要的字段将是您使用 javascript 填充的隐藏字段。如果您的表单中的字段被调用image_selection,那么form.cleaned_data['image_selection']将自动成为所选图像的列表。


推荐阅读