Как я могу удалить несколько записей или объектов в django? - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу удалить несколько записей с помощью флажка html, но не понимаю, как выполнить эту задачу. В настоящее время в моем проекте я реализую одну запись или объект удаления с помощью обобщенных c представлений, как вы можете видеть в приведенном ниже коде.

Как я могу удалить несколько записей с помощью флажка?
какие изменения мне нужны делать в моем коде?

Весь код Отредактирован с ошибкой трассировки @ ruddra

views.py

class DeleteProducts(SuccessMessageMixin, View):
    success_url = reverse_lazy('stock:stock')
    success_message = "Products {} are deleted successfully."

    def post(self, request, *args, **kwargs):
        products = self.request.POST.getlist('product')
        products_deleted = Product.objects.filter(pk__in=products).delete()
        msg = self.success_message.format(', '.join(products_deleted))
        messages.success(self.request, msg, extra_tags='alert-danger')
        return HttpResponseRedirect(self.success_url)

urls.py

      path('delete', login_required(DeleteProducts.as_view(), login_url='login'), name='deleteproducts'),

шаблон. html

{% extends 'base.html' %}
{% block content %}
<div>
  <h2 class="text-center" ><i>Stock!</i></h2>
    {% if messages %}
    {%for message in messages%}
        <div class="alert {{ message.tags }}" role="alert">
            {{ message }}
        </div>
    {% endfor %}
    {% endif %}
  <hr/>
<form method="POST" action="{% url 'stock:deleteproducts' %}">
{% csrf_token %}
  {% for product in page_obj %}

  <div class="row" >
      <input type="checkbox" value="{{ product.id }}">
    <div class="col-sm-2" >
          <h5>{{ product.id }}</h5>
          <img src="{{ product.Picture.url }}" height="120px"  />
    </div>
    <div class="col-sm-4" >
      <h5><u>Product Name</u>: {{ product.pro_name }}</h5>
      <h6><u>Company Name</u>: {{product.companyName}}</h6>
      <div class="row" >
        <div class="col-sm" >
           <p>Purchase Price: <b>{{product.Purchase_Price}}</b></p>
        </div>
        <div class="col-sm" >
          <p class="pt-0">Sale Price: <b>{{product.Sale_Price}}</b> </p>
        </div>
      </div>
      <div class="row" >
        <div class="col-sm" >
           <p>Quantity <b>{{product.Quantity}}</b></p>
        </div>
        <div class="col-sm" >
          <p> Added By:  <b>{{product.saler}}</b> </p>
        </div>
      </div>
    </div>
       <div class="col-sm-4" >
         <p><b>Added Date</b>:{{ product.pub_date }}</p>
         <hr/>
         <center>
           <a href="{% url 'stock:editproduct' product.id %}" class="btn btn-success" >Edit</a>

         </center>

    </div>

  </div>
  <hr/>

  {% endfor %}
 <input type="submit" class="btn btn-danger" value="Delete" >
</form>
    <div class="pagination " >
        <div class="step-links">
            {% if page_obj.has_previous %}
                <a href="?page=1" class="btn btn-sm btn-primary">&laquo; first</a>
                <a href="?page={{ page_obj.previous_page_number }}" class="btn btn-sm btn-success">previous</a>
            {% endif %}


            {% if page_obj.has_next %}
                <a href="?page={{ page_obj.next_page_number }}" class="btn btn-sm btn-success " >next</a>
                <a href="?page={{ page_obj.paginator.num_pages }}" class="btn btn-sm btn-primary" >last &raquo;</a>
            {% endif %}
            <br/>
                <div
                        class="current">
                Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
            </div>

        </div>
    </div>



</div>

{% endblock %}

traceback

Internal Server Error: /stock/delete
Traceback (most recent call last):
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\Adil Ijaz\Desktop\onlineProject\market\stock\views.py", line 131, in post
    msg = self.success_message.format(', '.join(products_deleted))
TypeError: sequence item 0: expected str instance, int found

1 Ответ

0 голосов
/ 06 апреля 2020

Вероятно, вы не можете сделать это с DeleteView, так как он ожидает, что один экземпляр будет удален. Для этого вам нужно создать новый вид. Вот так:

from django.views import View
from django.http import HttpResponseRedirect

class DeleteProducts(SuccessMessageMixin, View):
    success_url = reverse_lazy('stock:stock')
    success_message = "Products {} are deleted successfully."

    def post(self, request, *args, **kwargs):
        products = self.request.POST.getlist('product')
        products_deleted = Product.objects.filter(pk__in=products).delete()
        msg = self.success_message.format(', '.join(map(str, products_deleted)))
        messages.success(self.request, msg, extra_tags='alert-danger')
        return HttpResponseRedirect(self.success_url)

Затем обновите URL:

path('delete', login_required(DeleteProducts.as_view(), login_url='login'), name='deleteproducts'),

И в шаблоне:

<form method="POST" action={% url 'deleteproducts' %}>

Я использую request.POST.getlist для получения нескольких позиций (или идентификаторов продуктов) из почтового запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...