首页 > 解决方案 > 为什么Django中模型方法的返回值没有显示在模板中?

问题描述

我的模型中有这个功能,当我尝试运行服务器时没有出现。我认为我正在正确访问该方法,但是当我尝试在 total_balance() 函数中编写 print("ENTER") 时,没有任何显示,这让我认为它甚至根本没有进入该方法。奇怪的是,如果我去掉搜索功能,这个功能就会起作用。

模型.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def total_balance():
        transaction_list = Transaction.objects.filter(user=User)
        total_balance_amount = 0
        for transaction in transaction_list:
            if transaction.category=='Income':
                total_balance_amount += transaction.amount
            elif transaction.category=='Expense':
                total_balance_amount -= transaction.amount
        return total_balance_amount

视图.py

def profile(request):

    if request.method == 'GET':

        query = request.GET.get('q')

        if query and query!="":
            results = Transaction.objects.filter(Q(tag__icontains=query))
        else:
            results = Transaction.objects.all()

        transactions = {
            'transactions' : results,
        }

        profile = {
            'profile' : Profile.objects.all()
        }
        return render(request, 'users/profile.html', transactions, profile)

模板.py

<h5 class="card-title">Total Balance</h5>
                        <p class="card-text">₱{{ profile.total_balance }}</p>

有人可以帮我确定这不起作用的原因以及如何解决它吗?谢谢你。

标签: pythondjangofunctionsearchmethods

解决方案


这里至少有四个问题。

首先,由于某种原因,您将两个单独的字典传递给render. 那是行不通的;您需要一个包含多个条目的字典。

    context = {
        'transactions' : results,
        'profile' : Profile.objects.all()
    }
    return render(request, 'users/profile.html', context )

其次,profile尽管名称是单数,但它是所有配置文件的查询集。您需要在模板中遍历它:

{% for prof in profile %}
    <p class="card-text">₱{{ prof.total_balance }}</p>
{% endfor %}

理想情况下,您会为上下文变量使用更合适的名称,即profiles.

接下来,您的total_balance方法本身有两个问题。首先,Python 中的任何方法都需要带self参数。其次,您需要使用该参数来访问字段的user而不是 User 类。所以:

def total_balance(self):
    transaction_list = Transaction.objects.filter(user=self.user)

尽管请注意,第二行可以更容易地编写:

    transaction_list = self.user.transaction_set.all()

推荐阅读