Django - 在 ListView 或模型中调用函数以更改模型布尔状态

Django - Calling function in ListView or model to change model bolean status

我想调用一个函数 - 从模型或 Listview 调用,它将更改 Order.isDone 状态 - 单击模板中的按钮后为 TRUE 或 FALSE。

Model.py:

class Order(models.Model):
    isDone = models.BooleanField(default=False, verbose_name='Zrealizowane')
 

views.py:

class OrderListView (ListView):
  model = Order
  template_name = 'orders/orders_list.html'
  ordering = ['-orderDate']

urls.py:

urlpatterns = [
    path('', views.home, name='page-home'),
    path('orders_list/', OrderListView.as_view(), name='page-orders-list'),
    path('completed_orders_list/', OrderCompletedListView.as_view(), name='page-completed-orders-list'),
    path('orders/order_create/', OrderCreateView.as_view(), name='page-order-create'),
    path('orders/<int:pk>/delete/', OrderDeleteView.as_view(), name='page-order-delete'),
]

模板:

      <tbody>
        {% for order in object_list %}
          {% if order.isDone == False %}
          <tr>
            <td>
              <button type="button" class="btn btn-secondary" data-toggle="modal" data-target="#exampleModalCenter">Szczegóły</button>
              <form action="{% url 'page-orders-list' order.id %}" method="post">
                {% csrf_token %}
                <button class="btn btn-info btn-sm">Finish order</button>
              <form>
              <a class="btn btn-danger adminButton" href="{% url 'page-order-delete' order.id %}">Usuń</a>
            </td>
          </tr>
          {% endif %}
        {% endfor %}
      </tbody>
    </table>
  </div>

{% endblock %}

最简单的方法是什么?

我建议为此使用另一个视图。您可以在视图中使用 get 方法来更改订单的状态。在您的 HTML 中,您只需要使用 link 而不是表格。

所以像这样:

views.py

class OrderFinishView(RedirectView):
  success_url = None  # After finishing the order, where do you want to redirect the user?
  
  def get(self, request, *args, **kwargs):
     order_id = self.kwargs['pk_order']  # pk_order must be in your URL
     order = get_object_or_404(Order, pk=order_id)

     order.is_done = True
     order.save()

     return super().get(request, *args, **kwargs)

urls.py

urlpatterns = [
    path('', views.home, name='page-home'),
    path('orders_list/', OrderListView.as_view(), name='page-orders-list'),
    path('completed_orders_list/', OrderCompletedListView.as_view(), name='page-completed-orders-list'),
    path('orders/order_create/', OrderCreateView.as_view(), name='page-order-create'),
    path('orders/<int:pk>/delete/', OrderDeleteView.as_view(), name='page-order-delete'),
    path('orders/<int:pk_order>/finish', OrderFinishView.as_view(), name='page-order-finish'),
]

模板

      <tbody>
        {% for order in object_list %}
          {% if order.isDone == False %}
          <tr>
            <td>
                <a href={% url 'page-order-finish' order.id %}>Finish</a>
            </td>
          </tr>
          {% endif %}
        {% endfor %}
      </tbody>
    </table>
  </div>

{% endblock %}

另一个想法是使用 UpdateView 更新您的带有 PartialOrderForm 的订单,它只包含 is_done 字段。

我使用了@vinkomlacic 的解决方案,但我更改了 get 函数的 return:

  def get(self, request, *args, **kwargs):
      order_id = self.kwargs['pk_order']  # pk_order must be in your URL
      order = get_object_or_404(Order, pk=order_id)
      order.isDone = True
      order.save()
      return redirect(self.success_url)

在 class

中设置 success_url 后似乎可以正常工作了