【问题标题】:Django if ImageField is left blank or is equal to none return last image uploaded如果 ImageField 留空或等于无,则 Django 返回最后上传的图像
【发布时间】:2015-08-20 19:56:03
【问题描述】:

我正在尝试创建一个图片库,人们可以在其中上传多张图片。上传图片有 8 个字段。我遇到的问题是,当用户上传的图片少于 8 张时。如果其中一个图像字段留空,则会导致图库在该特定字段中为空白。

目前,当我返回图片时,我会对其进行过滤以显示上传的最新图片。 示例:

gallery = Content.objects.filter(user=request.user).order_by("-id")[0]

我想知道是否有人可以帮助我找到一种方法,当我使用时:

content.image1 = request.FILES.get('image1_upload', None)

如果返回 None 我可以让 Django 使用提交的最后一个图像,而不是它返回的 None。我觉得应该是这样的:

if 'image1_upload' in request.FILES:
    content.image1 = request.FILES('image1_upload')
elif None:
    content.image1 = Content.objects.get("the last uploaded image")

感谢您的帮助!下面是我的代码”

Views.py:

@login_required
def register(request):
    if request.POST:
        content = Content()
        content.user = request.user
        content.image1 = request.FILES.get('image1_upload', None)
        content.image2 = request.FILES.get('image2_upload', None)
        content.image3 = request.FILES.get('image3_upload', None)
        content.image4 = request.FILES.get('image4_upload', None)
        content.image5 = request.FILES.get('image5_upload', None)
        content.image6 = request.FILES.get('image6_upload', None)
        content.image7 = request.FILES.get('image7_upload', None)
        content.image8 = request.FILES.get('image8_upload', None)
        content.terms = request.POST.get('terms')
        content.date = timezone.now()
        content.save()

    return redirect('/portal/register')
try:
    gallery = Content.objects.filter(user=request.user).order_by("-id")[0]
    print gallery
    return render(request, 'portal/register.html', {'gallery': gallery})
except ObjectDoesNotExist:
    print 'Does Not Exist!'
    return render(request, 'portal/register.html')

型号:

def content_file_name(instance, filename):
    return '/'.join(['content', instance.user.username, filename])


class Content(models.Model):
    user = models.OneToOneField(User, unique=True)
    image1 = models.ImageField(upload_to=content_file_name, null=True, blank=True)
    image2 = models.ImageField(upload_to=content_file_name, null=True, blank=True)
    image3 = models.ImageField(upload_to=content_file_name, null=True, blank=True)
    image4 = models.ImageField(upload_to=content_file_name, null=True, blank=True)
    image5 = models.ImageField(upload_to=content_file_name, null=True, blank=True)
    image6 = models.ImageField(upload_to=content_file_name, null=True, blank=True)
    image7 = models.ImageField(upload_to=content_file_name, null=True, blank=True)
    image8 = models.ImageField(upload_to=content_file_name, null=True, blank=True)
    terms = models.ImageField(upload_to=content_file_name, null=True, blank=True)

HTML:

{% extends 'portal/base.html' %}

{% load staticfiles %}
{% block head_block %}
<script language="javascript" type="text/javascript" src="{% static 'js/input.js' %}"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" type="text/javascript"></script>

{% endblock %}
{% block body_block %}
<div class="container">
        <form role="form" method="post" action="." id="js-upload-form" enctype="multipart/form-data">
                            {% csrf_token %}
        <div class="row">

            <div class="col-lg-12">
                <h1 class="page-header">{{ user.username }}</h1>
            </div>

            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image1 %}
                    <img class="img-responsive" id="image1" src="/media/{{ gallery.image1 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image1" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
                <input type="file" name="image1_upload" id="image1_upload" multiple>
            </div>

            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image2 %}
                    <img class="img-responsive" id="image2" src="/media/{{ gallery.image2 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image2" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
                <input type="file" name="image2_upload" id="image2_upload" multiple>
            </div>


            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image3 %}
                    <img class="img-responsive" id="image3" src="/media/{{ gallery.image3 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image3" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
                <input type="file" name="image3_upload" id="image3_upload" multiple>
            </div>

            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image4 %}
                    <img class="img-responsive" id="image4" src="/media/{{ gallery.image4 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image4" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
                <input type="file" name="image4_upload" id="image4_upload" multiple>
            </div>

            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image5 %}
                    <img class="img-responsive" id="image5" src="/media/{{ gallery.image5 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image5" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
                <input type="file" name="image5_upload" id="image5_upload" multiple>
            </div>

            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image6 %}
                    <img class="img-responsive" id="image6" src="/media/{{ gallery.image6 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image6" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
                <input type="file" name="image6_upload" id="image6_upload" multiple>
            </div>

            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image7 %}
                    <img class="img-responsive" id="image7" src="/media/{{ gallery.image7 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image7" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
                <input type="file" name="image7_upload" id="image7_upload" multiple>
            </div>

            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image8 %}
                    <img class="img-responsive" id="image8" src="/media/{{ gallery.image8 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image8" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
                <input type="file" name="image8_upload" id="image8_upload" multiple>
            </div>
        </div>
        <br>
             <!--<div class="form-group">-->
                 <!--<textarea name="terms" id="terms" class="form-control input-sm" placeholder="Terms" value="{{ content.terms }}"></textarea>-->
             <!--</div>-->
            <div class="form-group">
                <input type="text" name="terms" id="terms" class="form-control input-sm" placeholder="terms" value="{{ gallery.terms }}">
            </div>
        <br>
            <input type="submit" value="Register" id="js-upload-submit" class="btn btn-info btn-block">
        </form>
    <br>
    <!-- Button trigger modal -->
<button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
  iPad View
</button>

<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        <div class="row">

            <div class="col-lg-12">
                <h1 class="page-header">{{ user.Username }}</h1>
            </div>

            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                     {% if gallery.image1 %}
                    <img class="img-responsive" id="image1" src="/media/{{ gallery.image1 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image1" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
            </div>
            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                     {% if gallery.image2 %}
                    <img class="img-responsive" id="image2" src="/media/{{ gallery.image2 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image2" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
            </div>
            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image3 %}
                    <img class="img-responsive" id="image3" src="/media/{{ gallery.image3 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image3" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
            </div>
            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image4 %}
                    <img class="img-responsive" id="image4" src="/media/{{ gallery.image4 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image4" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
            </div>
            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image5 %}
                    <img class="img-responsive" id="image5" src="/media/{{ gallery.image5 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image5" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
            </div>
            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image6 %}
                    <img class="img-responsive" id="image6" src="/media/{{ gallery.image6 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image6" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
            </div>
            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image7 %}
                    <img class="img-responsive" id="image7" src="/media/{{ gallery.image7 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image7" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
            </div>
            <div class="col-lg-3 col-md-4 col-xs-6 thumb">
                <a class="thumbnail" href="#">
                    {% if gallery.image8 %}
                    <img class="img-responsive" id="image8" src="/media/{{ gallery.image8 }}" alt="">
                    {% else %}
                    <img class="img-responsive" id="image8" src="/media/images/placeholder.png" alt="">
                    {% endif %}
                </a>
            </div>

        </div>
          <p>
                {{ gallery.terms }}
            </p>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>
    <script language="javascript" type="text/javascript" src="{% static 'js/preview.js' %}"></script>
{% endblock %}
<!--http://jsfiddle.net/Mqvgx/-->

【问题讨论】:

  • 我认为您的问题与您想象的不同。你听说过循环吗?它们可以帮助您避免始终编写八次相同的代码,还可以帮助您避免遇到您最初描述的问题。
  • 是的,我肯定听说过循环。我可以将多个图像保存到一个 imageField 然后按顺序调用它吗?你能举个例子吗?
  • 您可以创建一个Image 模型,该模型具有指向它所属的Content 实例的外键。然后每个Content 实例可以有任意数量的Images。使用content_instance.image_set 访问Content 实例的Images(默认名称,可以通过related_name 更改)

标签: python django image imagefield


【解决方案1】:

你为什么想做你正在做的事?所以如果你想上传 500 张图片,你会在模型中添加 500 个字段,然后在视图中添加 500 行代码来捕获所有字段?来吧,有更好的方法。让编程语言完成繁重的工作。

根据Dane's comment above,您需要的是创建一个 Image 模型,将 ForeignKey 用于您的 Content 模型,然后您可以在视图中执行以下操作:

{% for i in content.image_set.all %}
    {# then iterate over i to grab all the images into your image tag #}
{% endfor %}

帮助您前进的链接(我建议您密切注意那里发生的事情):

恕我直言,您的方法是灾难,不会扩大规模。

【讨论】:

  • 感谢您的帮助。我肯定会调查这些。我将其设置为 8 张图片,因为我想专门使用 8 张图片。我还有更多的学习要做……这方面还是新的。谢谢你的指导!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 2016-04-23
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
相关资源
最近更新 更多