Django, если ImageField оставлен пустым или равен none, возвращает последнее загруженное изображение

Я пытаюсь создать галерею изображений, где люди могут загружать несколько изображений. Есть 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")

Я ценю любую помощь! Ниже мой код"

Просмотры.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/-->

person Ryan113    schedule 20.08.2015    source источник
comment
Я думаю, что ваша проблема отличается от того, что вы думаете. Вы слышали о петлях? Они могут помочь вам избежать написания одного и того же кода восемь раз за все время, а также могут помочь вам избежать проблемы, которую вы описали в первую очередь.   -  person Sven Marnach    schedule 20.08.2015
comment
Да, я определенно слышал о петлях. Могу ли я просто сохранить несколько изображений в поле изображения, а затем вызвать его по порядку? У вас есть пример?   -  person Ryan113    schedule 20.08.2015
comment
Вы можете создать модель Image, которая имеет внешний ключ для экземпляра Content, которому она принадлежит. Тогда у вас может быть произвольное количество Images на Content экземпляра. Доступ к Image экземпляра Content с помощью content_instance.image_set (имя по умолчанию, можно изменить с помощью related_name)   -  person Dane Hillard    schedule 20.08.2015


Ответы (1)


Почему вы хотите делать то, что вы делаете? Итак, если вы хотите, чтобы было загружено 500 изображений, вы должны добавить 500 полей в свою модель, а затем добавить 500 строк кода в свои представления, чтобы поймать все поля? Да ладно, есть лучший подход. Пусть язык программирования сделает тяжелую работу.

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

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

Ссылка, которая поможет вам пройти (рекомендую вам внимательно следить за тем, что там происходит):

При всем уважении, ваш подход — это катастрофа, и он не будет масштабироваться.

person KhoPhi    schedule 20.08.2015
comment
Я ценю вашу помощь. Я определенно собираюсь изучить эти. Я установил его на 8 изображений, потому что хотел использовать именно 8 изображений. У меня еще есть чему поучиться... Все еще новичок в этом. Спасибо за направление! - person Ryan113; 21.08.2015