Django:使用ListView点击修改数据库对象

Posted

技术标签:

【中文标题】Django:使用ListView点击修改数据库对象【英文标题】:Django: Modify database object on click using a ListView 【发布时间】:2021-04-23 16:42:11 【问题描述】:

我有一个 ListView 用于显示产品列表。在每个产品/行的右侧,我想要一个“归档”按钮,单击该按钮会将数据库中产品的“归档”字段从 True 更改为 False。 我想只使用 Django 来做到这一点,我认为这是可能的,但我很难找出方法。 我正在尝试使用表单来执行此操作,但我不知道如何将当前对象(在循环中)的 pk 发送回视图以进行更改。 这是我的模板(相关部分):

% for product in product_list %
                <tr>
                  <th scope="row"> product.pk </th>
                  <td>
                    <a href="% url 'accounts:products_edit' pk=product.pk %">
                       product.title </a
                    >
                  </td>
                
                  <td class="d-flex justify-content-between">
                    <form action="" method="POST">
                      % csrf_token %
                      <button type="submit"><i class="fas fa-trash" style="color: grey"></i></button>
                    </form>
                  </td>
                </tr>
% endfor %

这是我的看法:

class ProductsListView(ListView, LoginRequiredMixin):
    template_name = "accounts/products/products_list.html"
    model = Product

    def get_context_data(self, **kwargs):
        # ...
   
        return context
    def post(self, request, *args, **kwargs):
        # modify object from pk here
        return HttpResponseRedirect(self.request.path_info)

我看过几篇类似情况的帖子,但没有找到完全适合我的情况的解决方案。任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

我认为最好有一个新端点accounts/products/archive/productPk productPk 作为要归档的产品的 PK 与表单方法相比,这有 2 个好处 1.该端点可以通过更简单的调用在您的视图中重用,而不是使用多个表单 2.如果你决定在你的 FE 旁边有一个 API,你已经完成了归档操作,使用你的方法你必须创建多种归档方式

根据您已有的代码编写 POST 请求本身非常简单,只需确保新端点上存在所有正确的验证

编辑 - 更多信息 创建一个接收 PK 作为参数的新视图

def archive_product(request, archive_pk):
    # Rest of the method

使用路径参数添加一个新的 url 路径(django 使用正则表达式)

path(r'^accounts/products/archive/(?P<product_pk>\d0,50)/$', views.archive_product)

更改您的 JS 代码以调用此新 URL 而不是提交表单,在这里您必须自己编写代码,因为我的 JS 知识比较有限,无法提供至少几乎可以工作的代码

django 代码基于文档,因为我不想为此创建新项目。该代码应该已经存在于您当前的视图中,或者编写起来非常简单

【讨论】:

感谢您的回答,但您能详细说明一下/显示一些代码吗?总的来说,我对 Django 和 web 还是很陌生,所以我不确定我是否完全理解。 我不懂 JS,所以我说我只想使用 Django(和 html) 如果您真的不想使用 JS,您可以将表单操作更改为新的 url,我相信表单将字段作为请求正文发送,因此逻辑可能与使用时有所不同路径参数w3schools.com/html/html_forms.asp 好的,谢谢,我会试试的。虽然我希望有办法做到这一点,同时保持在同一页面上 据我所知,保持在同一页面上需要您使用 JS。在进行 FE 开发的同时开始尝试基本的 JS 是明智的

以上是关于Django:使用ListView点击修改数据库对象的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 django 表单传递到 ListView

带有分页和分组的 Django ListView

子类化 Django ListView

使用Python Django框架创建一个小型博客

请问C#如何在listview中点击获取表头的值

从 Ajax GET 方法接收数据后,使用 Django Listview 类重新加载页面