2

だから私は Django で経費シート アプリを作成しています。すべての経費の合計を取得しようとしています。これをテンプレートに表示したいと考えています。

私のモデル:

class Expense(models.Model):
    PAYMENT_CHOICES = (
      ('Cash', 'cash'), 
      ('Credit', 'credit'),
      ('Debit', 'debit')
    )
    date = models.DateField()
    store = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=20, decimal_places=2)
    payment_type = models.CharField(max_length=8, choices=PAYMENT_CHOICES)
    category = models.CharField(max_length=100)

    def __unicode__(self):
      return u'%s' % (self.date)

    def _price_sum(self):
      return self.objects.aggregate(total_price = Sum('price'))

    price_sum = property(_price_sum)

タグを使用してテンプレートで「price_sum」を呼び出そうとしています{{ expenses.price_sum }}

私のテンプレートは次のようになります

{% if expenses %}
<table class='table table-hover'>
<tr>
  <thead>
    <th>Date</th>
    <th>Store</th>
    <th>Price</th>
    <th>Payment Type</th>
    <th>Category</th>
    <th></th>
    <th></th>
  </thead>
</tr>
 {% for expense in expenses %}
<tr>
  <tbody>
    <td>{{expense.date}}</td>
    <td>{{expense.store}}</td>
    <td>${{expense.price|floatformat:"2"|intcomma}}</td>
    <td>{{expense.payment_type}}</td>
    <td>{{expense.category}}</td>
    <td>
      <form action='{{expense.id}}/' method='get'>
        <input type="submit" value="Edit" class="btn">
      </form></td>
    <td>
      <form action='{{expense.id}}/delete/' method='post'>{% csrf_token %}
        <input type="submit" value="Delete" class="btn btn-danger" data-dismiss="alert">
      </form></td>
  </tbody>
</tr>

{% endfor %}

</table>
<h3>Table: {{ expenses.price_sum }}</h3>
{% else %}
    <p>No expenses logged.</p>
{% endif %}

テンプレート タグの使い方が間違っているのか、関数が間違っているのか、何が問題なのかはわかりません。これはおそらく本当に単純なことだと思いますが、StackOverflow と Django と Python のドキュメント、および見つけられるものすべてを検索しましたが、それを理解することはできません。

更新: views.py

from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render
from expenses.models import Expense
from expenses.form import ExpenseForm

def index(request,template='expenses/index.html'):
  all_expenses = Expense.objects.all()
  return render(request, template, {'all_expenses': all_expenses})

def new(request, template='expenses/new.html'):
  if request.method == 'POST':
    new_expense = ExpenseForm(request.POST)
    if new_expense.is_valid() and new_expense.clean():
      new_expense.save()
      return HttpResponseRedirect('/expenses/')
  else:
    new_expense = ExpenseForm()

  return render(request, template, {'new_expense':new_expense})

def edit(request, expense_id, template='expenses/edit.html'):
  expense = Expense.objects.get(id=expense_id)
  if request.method == 'POST':
    form = ExpenseForm(request.post, instance=expense)
    if form.is_valid and form.clean():
      expense = form.save()
      return HttpResponseRedirect('/expenses/')
    else:
      expense = ExpenseForm(instance=expense)

  return render(request, template, {'expense':expense})

def delete(request, expense_id):
  if request.method == 'POST':
    expense = Expense.objects.get(id=expense_id).delete()
    return HttpResponseRedirect('/expenses/')
  else:
    return HttpResponse(status=404)
4

2 に答える 2

0

これらのビューのどれが集計を使用するビューであるかはわかりません (そして、なぜそれらすべてを投稿したのか疑問に思います)。ただし、明確なことは、それらのいずれExpenseにもオブジェクトを渡すことは決してないということです。これは Expense のインスタンス メソッドであるため、アクセスすることはできません。price_sum

しかし、実際にはそれをしたくありません。price_sumインスタンスとまったく対話しないため、インスタンスメソッドであってはなりません。実際、シェルからメソッドを実行しようとすると、次のエラーが表示されます。

AttributeError: Manager isn't accessible via Expense instances

これは一目瞭然です。

これを行う代わりに、カスタム マネージャーを定義し、そこで price_sum メソッドを定義する必要があります。次にExpenses.objects.price_sum()、コンテキストでテンプレートに直接渡すことができる にアクセスできます。

于 2013-06-19T08:23:30.920 に答える