Python Django:使用ListView在单击时修改数据库对象

Python Django:使用ListView在单击时修改数据库对象,python,html,django,database,django-templates,Python,Html,Django,Database,Django Templates,我有一个用于显示产品列表的列表视图。在每个产品/行的右侧,我想要一个“归档”按钮,当单击该按钮时,将把数据库中产品的“归档”字段从True更改为False 我想只使用Django就可以做到这一点,我认为这是可能的,但我很难找到方法 我正在尝试使用表单来完成,但我不知道如何将当前对象(在循环中)的pk发送回视图以进行更改 这是我的模板(相关部分): 我看过几篇类似情况的帖子,但没有找到一个完全适用于我的案例的解决方案。任何帮助都将不胜感激 我认为最好有一个新的端点 accounts/product

我有一个用于显示产品列表的列表视图。在每个产品/行的右侧,我想要一个“归档”按钮,当单击该按钮时,将把数据库中产品的“归档”字段从True更改为False
我想只使用Django就可以做到这一点,我认为这是可能的,但我很难找到方法

我正在尝试使用表单来完成,但我不知道如何将当前对象(在循环中)的pk发送回视图以进行更改
这是我的模板(相关部分):


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

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

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

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

def archive_product(request, archive_pk):
    # Rest of the method
使用path参数添加新的url路径(django使用正则表达式)

path(r'^accounts/products/archive/(?P\d{0,50})/$,views.archive\u product)
更改您的JS代码以调用此新URL,而不是提交表单,在这里您必须自己编写此代码,因为我的JS知识有点有限,无法提供至少可以正常工作的代码


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

谢谢您的回答,但是您能详细说明一下/显示一些代码吗?我对Django和web还比较陌生,所以我不确定自己是否完全理解。我会用更多信息编辑我的答案我不懂JS,这就是为什么我说我只想使用Django(和html),如果你真的不想使用JS,你可以将表单操作更改为新的url,我相信表单会将字段作为请求主体发送,所以当使用path参数时,逻辑可能会有点不同。好的,谢谢,我会尝试一下。虽然我希望有一种方法可以做到这一点,同时保持在同一页上
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)
def archive_product(request, archive_pk):
    # Rest of the method
path(r'^accounts/products/archive/(?P<product_pk>\d{0,50})/$', views.archive_product)