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点击修改数据库对象的主要内容,如果未能解决你的问题,请参考以下文章