2015-10-07 2 views
0

У меня есть Джанго modelformset, который делает следующее:Удаление отдельных связанных файлов - Джанго

Добавить страницу

  • Добавить модель инстанс «продукта»
  • модели связаны между собой (ForeignKey) в «продукт» для добавления нескольких изображений в экземпляр продукта.

Редактировать страницу

  • formset также на странице редактирования, она предварительно заполняется с экземпляром «продукта» и связанных с ним изображений.

Вот проблема, когда я загрузить несколько изображений на продукт, я хочу, чтобы иметь возможность удалить выбранные изображения на странице редактирования (держать остальное).

Как передать отдельное изображение - его местоположение в базе данных и его расположение в файловой системе, какой-либо метод удаления? В идеальном мире я бы хотел добиться этого каким-то методом AJAX, но с чего начать?

Просмотр для редактирования ...

def EditProduct(request, pk): 
    instance = get_object_or_404(Product, id=pk) 
    ImageFormSet = modelformset_factory(ProductImage, 
             form=ImageForm, extra=4) 

    if request.method == 'POST': 
     product_form = AddEditProductForm(request.POST, instance=instance) 
     formset = ImageFormSet(request.POST, request.FILES, 
         queryset=ProductImage.objects.none()) 

     if product_form.is_valid() and formset.is_valid(): 

      product = product_form.save() 

      images = formset.save(commit=False) 
      for image in images: 
       image.product = product 
       image.save() 
      return HttpResponseRedirect('/product/') 

     else: 
      print (product_form.errors, formset.errors) 

    else: 
     product_form = AddEditProductForm(instance=instance) 
     formset = ImageFormSet(queryset=ProductImage.objects.all()) 

    return render(request, 'product/edit.html', 
        {'product_form': product_form, 'formset': formset}, 
        context_instance=RequestContext(request)) 

Незначительная вещь - Как я могу реально отобразить, в шаблоне, изображения, которые уже были загружены в продукт? В настоящее время изображения отображаются только как предварительно заполненные дополнительные экземпляры набора форм (url to image file).

шаблон для редактирования ...

<form action="" method="POST" enctype="multipart/form-data"> 
{% csrf_token %} 
    <table> 
      <p> {{ product_form.as_ul }}</p> 

       <p> current images </p>  

       {% for product in product.images.all %} 
       <img src="{{ product.image.url }}" alt="..."> 
       {% endfor %} 
       <br> <p> break </p> 

      {{ formset.management_form }} 
      {% for form in formset %} 
      {{ form }} 
      {% endfor %} 
    </table> 

    <input type="submit" value="Confirm Changes"> 

ответ

0

После долгих поисков я нашел way to delete individual images с помощью пользовательской функции.

Если вы хотите, чтобы отобразить изображения, связанные с продуктом, есть несколько способов, которые я нашел: один путь к modify the FileField widget, если вы хотите, чтобы отобразить изображения в виде ...

Что я сделал вместо этого было удалено загруженные изображения, которые предварительно заполнили форму, изменив второй запрос на queryset=ProductImage.objects.none()), затем я добавил pictures = ProductImage.objects.filter(product_id = pk) в представление и затем пропустил их в шаблоне.

Надеюсь, это поможет кому-то.

Смежные вопросы