如何 Link 具有基于 class 的视图的 url 的模板?

How to Link a template with the url of a class-based-view?

我正在尝试创建一个 link <a> 将我重定向到视图 DeleteView 的 url。我希望 link 出现在我的应用程序模板中。通过单击 link,您将被重定向到 DeleteView.

的 url

这是删除视图:

class imagenDelete(DeleteView):
model = imagen

def get_id(self, request):
    getall = imagen.objects.all()

这是urls.py:

urlpatterns = [

path('', views.galeria, name='galeria'),
path('delete/<int:pk>', views.imagenDelete.as_view(), name='deletegaleria'),

]

这是我试图在我的应用程序模板中创建的 link:

<a style="font-size: 3rem;" href="{% url 'deletegaleria' pk %}">Click to delete</a>

问题是,在 url 中,我必须传递要删除的图像的 ID。如果我这样写 {% url 'deletegaleria' 14 %} 就可以了,te link 显示在模板中,它会将您重定向到 url 以删除 id = 14.[=23 的图像=]

如果我这样做:

{% for on in getall %}
<a style="font-size: 3rem;" href="{% url 'deletegaleria' o.id %}">Click to delete</a>
{% endfor %}

这不会给我任何错误,但不会在模板中显示 link。

如果我这样做 {% url 'deletegaleria' pk %} 基本上没有迭代,我会得到下一个错误:

Reverse for 'deletegaleria' with arguments '('',)' not found. 1 pattern(s) tried: ['galeria/delete/(?P[0-9]+)$']

@SpaceCat69- 首先,让我明白一点。我想你想要的是这个

  1. 您有一个将呈现所有数据的列表视图。假设您的数据采用 table 格式。每行
  2. 旁边会有删除link
  3. 单击删除 link 时,它应该重定向到删除视图。
  4. 因此,您需要向我们展示您如何呈现对象的列表视图。

为什么还要在删除视图中创建 get_id?它的作用是什么?为什么要在 DeleteView 中传递整个模型查询集。您的 DeleteView 应该有一个基于 URL.

中传递的 kwargs 的查询集

还有,你的 deleteview 不完整

deleteView 示例

class ProductDelete(LoginRequiredMixin, SuccessMessageMixin, DeleteView):
# specify the model you want to use
model = Product
template_name = "catalog/product/delete_product.html"
success_message = "Product Deleted Successfully"

def get_success_url(self):
    return reverse("catalog:product_list")

你有

path('delete/<int:pk>', views.imagenDelete.as_view(), name='deletegaleria'),

所以你必须在模板中使用 pk

{% for on in getall %}
  <a style="font-size: 3rem;" href="{% url 'deletegaleria' on.pk %}">Click to delete</a>
{% endfor %}

所以问题是我正在使用基于函数的视图来呈现我的模板,并使用 Class-基于视图来删除一些对象。

我为使其工作所做的工作仅适用于 class-based-views。

对于任何想知道下一段代码的作用的人:我创建了两个视图。一个用于显示图像。另一个显示了一个允许用户上传自己的图像的表单。当方法为 POST 时,我还保存了上传图像的用户。 稍后我创建了 DeleteView,只有当登录用户与上传图像的用户相同时,它才会删除图像。

views.py:

class galeriaListView(ListView):
    model = imagen
    template_name = "galeria/galeria.html"
    imagenes = imagen.objects.all()
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['imagenes'] = self.imagenes
        return context

class formularioimagenListView(ListView):
    model = imagen
    formulario_subir_imagen = formulario_img()
    template_name = "galeria/formulario_subir_imagen.html"
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['formulario_subir_imagen'] = self.formulario_subir_imagen
        return context
    def post(self, request, *args, **kwargs):
        formulario_subir_imagen = formulario_img(request.POST, request.FILES)
        if formulario_subir_imagen.is_valid():
            profile = formulario_subir_imagen.save(commit=False)
            profile.autor = request.user
            profile.save()
            return redirect("/galeria/")

class imagenDelete(DeleteView):
    model = imagen
    success_url = "/galeria/"
    template_name = "galeria/delete_imagen.html"
    def dispatch(self, request, *args, **kwargs):
        self.obj = self.get_object()
        if self.obj.autor != self.request.user:
            return HttpResponseForbidden("Cannot delete other's posts")
        return super(imagenDelete, self).dispatch(request, *args, **kwargs)
    

urls.py:

    path('', views.galeriaListView.as_view(), name='galeria'),
    path('<pk>/delete/', views.imagenDelete.as_view(), name='deleteimagen'),
    path('subir_imagen', views.formularioimagenListView.as_view(), name='subirimagen'),
    path('borrar_imagen', views.borrar_imagenListView.as_view(), name='opcionesimagenesaborrar'),

模板中的 <a> 看起来像这样。

template.html:

<a style="font-size: 3rem;" href="{% url 'subirimagen' %}">Click para subir imagen</a>
<a style="font-size: 3rem;" href="{% url 'opcionesimagenesaborrar' %}">Click para borrar tus imagenes</a>