【问题标题】:How use count() in a many to many field如何在多对多字段中使用 count()
【发布时间】:2018-04-17 18:12:59
【问题描述】:

我的 django 项目是关于资金管理的,所以它的一种资金交易类型是 MultipleTransaction,它只说它是由多个用户共同完成的。

我想在我的界面中显示一个 MultipleTransaction 的总值,使用 Django 模板引擎,我该怎么做?

我尝试了以下方法:

template.html

{% with total=transaction.value*transaction.users.count %}
   R${{ total }}
{% endwith %}

但我收到此错误消息:

/historico/ 处的模板语法错误

无法解析余数:来自“transaction.value*transaction.users.count”的“*transaction.users.count”

Model.py

# An abstract class containing info about a Transaction made by multiple users
class MultipleTransaction (Info):
    # All users that paid the the monthly bill
    users = models.ManyToManyField(User)

    #A file as receipt, it can be an image or a pdf. This is optional
    receipt = models.FileField(
        'Comprovante(s)',
        upload_to='comprovantes',
        blank=True,
        null=True
    )

    class Meta:
        # Make this class an Abstract class
        abstract = True
        # Human friendly singular and plural name
        verbose_name = 'Transação em Grupo'
        verbose_name_plural = 'Transações em Grupo'

View.py

@login_required
def historico(request):
    # Those 3 lines are queries of all transactions
    deposits = chain(Deposit.objects.all(), MonthlyDeposit.objects.all())
    withdraws = chain(Withdraw.objects.all(), EventSubscription.objects.all())
    transferences = Transference.objects.all()

    # Then all transactions are sorted by their atribute "created_at"
    transactions = sorted(
        chain(deposits,withdraws,transferences),
        key=lambda instance: instance.created_at
    )

    # Get all boxes to show their values
    boxes = Box.objects.all()

    return render(
        request,
        'shell/app_shell.html',
        {
            'is_varys': True,
            'transactions': transactions,
            'boxes':boxes,
            'title': 'Histórico'
        }
    )

【问题讨论】:

    标签: django


    【解决方案1】:

    Django 模板语言不支持乘法。您可以在模型中添加一个方法。

    class MultipleTransaction (Info):
        # All users that paid the the monthly bill
        users = models.ManyToManyField(User)
    
        def calc_total_value(self):
            return self.value * self.users.count()
    
    
    R${{ transaction.calc_total_value }}
    

    【讨论】:

      【解决方案2】:

      您不能简单地将模板中的变量相乘。您必须编写自己的自定义模板标签以进行乘法运算,或者只是在模型端进行计算。在模型中添加自定义方法来计算总交易价值是一个不错的方法。

      【讨论】:

      • 错误仍然存​​在:无法解析剩余部分:'*transaction.users.all.count' from 'transaction.value*transaction.users.all.count'
      • 错误:无法解析余数:'*transaction.user_set.count' from 'transaction.value*transaction.user_set.count'
      • 现在知道了。更新了答案。
      • 谢谢,两个答案都很好。如果您添加一个模板标签示例也能解决问题,那就太好了。
      • 查看post
      【解决方案3】:

      试试

      transaction.users.all().count
      

      或者

      transaction.all()[0].users.count
      

      【讨论】:

      • 错误 1: 无法解析剩余部分:来自“transaction.value*transaction.users.all()”的“*transaction.users.all().count”。 count' 错误 2: 无法解析余数:来自 'transaction.value*transaction.all()[0].users 的 '*transaction.all()[0].users.count'。计数'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2017-09-21
      • 2017-02-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 2015-11-01
      相关资源
      最近更新 更多