Python 如何在Django模板中使用instaceof?

Python 如何在Django模板中使用instaceof?,python,django,class,Python,Django,Class,您好,我有一个模板,该模板中有两个视图使用该模板a有一个用于删除对象的切换,因为我有两种类型的对象可以通过相同的表单删除,所以我想以某种方式验证对象的实例,以便决定使用哪个url进行删除。我如何在django模板中正确地编写这个 <form method="POST" action="{% if object instanceof Income %}{% url 'delete-income' object.id %}{% elif object insta

您好,我有一个模板,该模板中有两个视图使用该模板a有一个用于删除对象的切换,因为我有两种类型的对象可以通过相同的表单删除,所以我想以某种方式验证对象的实例,以便决定使用哪个url进行删除。我如何在django模板中正确地编写这个

 <form method="POST" action="{% if object instanceof Income %}{% url 'delete-income' object.id %}{% elif object instanceof Spending %}{% url 'delete-spending' object.id %}{% endif %}">
观点

class IncomeDeleteView(ObjectDeleteViewMixin):
    model = Income
    success_url = reverse_lazy('incomes')


class SpendingDeleteView(ObjectDeleteViewMixin):
    model = Spending
    success_url = reverse_lazy('spendings')
网址:

path('incoments/delete/',IncomeDeleteView.as_view(),name='delete-income'),
路径('spendings/delete/',SpendingDeleteView.as_view(),name='delete-expensing'),
请不要这样做。Django模板被故意限制,不允许函数调用、订阅等,以防止人们在模板中编写业务逻辑。模板通常专注于呈现逻辑。通过在模板中实现业务逻辑,通常会使it模板更难理解、更新等

解决这个问题最优雅的方法可能是在
收入
支出
类中定义一个方法,返回删除url的路径:

from django.urls import reverse

class Income(models.Model):
    # …

    def remove_url(self):
        return reverse('delete-income', kwargs={'pk': self.pk})

# …

class Spending(models.Model):
    # …

    def remove_url(self):
        return reverse('delete-spending', kwargs={'pk': self.pk})
然后,您可以使用以下工具渲染此内容:

<form method="POST" action="{{ object.remove_url }}">
请不要。Django模板被故意限制,不允许函数调用、订阅等,以防止人们在模板中编写业务逻辑。模板通常专注于呈现逻辑。通过在模板中实现业务逻辑,通常会使it模板更难理解、更新等

解决这个问题最优雅的方法可能是在
收入
支出
类中定义一个方法,返回删除url的路径:

from django.urls import reverse

class Income(models.Model):
    # …

    def remove_url(self):
        return reverse('delete-income', kwargs={'pk': self.pk})

# …

class Spending(models.Model):
    # …

    def remove_url(self):
        return reverse('delete-spending', kwargs={'pk': self.pk})
然后,您可以使用以下工具渲染此内容:

<form method="POST" action="{{ object.remove_url }}">


请不要。这不属于模板,这是业务逻辑。此外,一个对象可以是两种不同的类型是很奇怪的,虽然不是禁止的,但这通常不是一个好主意。可能在这里最好为每个类实现一个指向删除url的方法。我考虑过这样的事情,为了只创建一个url来删除对象,因为过程是相同的,但我真的不知道如何在Django中实现这一点。我将在问题和url中添加我的视图,您可以帮助我吗?您可以创建自定义模板。但正如@Willem Van Onsem所说,这是不推荐的。请不要。这不属于模板,这是业务逻辑。此外,一个对象可以是两种不同的类型是很奇怪的,虽然不是禁止的,但这通常不是一个好主意。可能在这里最好为每个类实现一个指向删除url的方法。我考虑过这样的事情,为了只创建一个url来删除对象,因为过程是相同的,但我真的不知道如何在Django中实现这一点。我将在问题和url中添加我的视图,您可以帮助我吗?您可以创建自定义模板。但是正如@Willem Van Onsem所说,这是不推荐的。谢谢你的想法,但是URL呢?我该怎么写呢?否则我就把它们当作are@ARYAN字体我们已经写了。通过调用
object.remove\u url
,我们将检索
reverse('delete-income',kwargs={'pk':self.pk})
的结果,例如,这是一个路径。我现在理解了,我实现了它,但它现在给我这个错误“'income'对象没有属性”\u default\u manager”@雅利安:但这通常与呈现移除对象无关,可能是因为您编写了
self.model=self.get_object()
,因为
self.model
现在是一个对象,您不应该更改
self.object
。谢谢您的想法,但是URL呢?我该怎么写呢?否则我就把它们当作are@ARYAN字体我们已经写了。通过调用
object.remove\u url
,我们将检索
reverse('delete-income',kwargs={'pk':self.pk})
的结果,例如,这是一个路径。我现在理解了,我实现了它,但它现在给我这个错误“'income'对象没有属性”\u default\u manager”@雅利安:但这通常与呈现移除对象无关,可能是因为您编写了
self.model=self.get_object()
,因为
self.model
现在是一个对象,所以您不应该更改
self.object