【问题标题】:Django: Modify database object on click using a ListViewDjango:使用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)

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

【问题讨论】:

    标签: python html django database django-templates


    【解决方案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>\d{0,50})/$', views.archive_product)
    

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

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

    【讨论】:

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