单击 table 中的按钮并重定向到同一页面

Click button in table and redirect to same page

我有一个看法:

class ProductList(SingleTableView):
    model = Product
    template_name = "app/product_list.html"
    table_class = ProductTable

每一行都有一个按钮应该执行 function():

class ButtonColumn(tables2.Column):
    empty_values = list() 
    def render(self, value, record): 
        return mark_safe(f"""<a href="/link/{record.id}/"><button class="btn btn-info">link</button></a>""")

这个 ButtonColumn 提供了一个按钮,点击后:

    path("link/<int:pk>", views.LinkView.as_view(), name="link"),

以及对应的视图:

class LinkView(TemplateView):
    model = Product
    template_name = "app/product_list.html"

    def get_success_url(self):
        return reverse_lazy('product-list')

    def get_context_data(self, **kwargs):
        context = super(LinkView, self).get_context_data(**kwargs)
        function[kwargs] # <------------------
        context["table"] = Product.objects.all()
        return(context)

我的问题是 Linkview - 我希望它执行 function 一些 URL 传输参数和 return 到前一页 (app/product_list.html)。我怎样才能做到这一点?

像这样修改ButtonColumn

class ButtonColumn(tables2.Column):
    empty_values = list() 
    def render(self, value, record): 
        return mark_safe(f"""<a href="/link/{record.id}/?price=10"><button class="btn btn-info">link</button></a>""")
# There is no need to mention these query parameter in path. 

路径将保持不变。 无需更改任何内容

    path("link/<int:pk>", views.LinkView.as_view(), name="link"),

在你ListView中,你会使用self.request.GET.get("param1", ""),其中param1是URL传输的参数,""是默认值。

    def get_context_data(self, **kwargs):
        context = super(LinkView, self).get_context_data(**kwargs)
        param1 = self.request.GET.get("param1", "")
        # OR
        function(self.request.GET) # extract required params in the function
        function[kwargs] # <------------------
        context["table"] = Product.objects.all()
        return(context)

注:Get是字典

重定向,

from django.shortcuts import redirects

# In your LinkView override get method
class LinkView(TemplateView):
    def get(self, request, *args, **kwargs)
        return redirect('some/url')