Django Datetime поле вопрос - PullRequest
       19

Django Datetime поле вопрос

0 голосов
/ 07 января 2011

Здравствуйте, у меня возникла проблема с django при попытке работать с datetime.В моем веб-приложении у меня есть такая таблица, когда я запускаю сервер.

ID  Owing
1   -100   (All the same value)
2   -100
3   -100
.    .
.    .
.    .

В одном столбце указан идентификатор счета-фактуры, а в другом - задолженность.Отношения один-один.Например, значение «задолженность» для «1» равно 100. К сожалению, именно здесь все идет не так, потому что во всем столбце («Owing») оно дает мне значение «задолженность» для ID = 1.Я хочу, чтобы каждое удостоверение личности давало мне свою причитающуюся стоимость.

Вот мое мнение.Мне также интересно, если мне может понадобиться где-нибудь цикл for.

def homepage(request):
    invoices_list = Invoice.objects.all()
    invoice_name = invoices_list[0].client_contract_number.client_number.name
    invoice_gross = invoices_list[0].invoice_gross
    payment_date = invoices_list[0].payment_date
    if payment_date <= datetime.now():
        owing = invoice_gross
        if payment_date > datetime.now():
            owing = 0
        else: owing= 0
    return render_to_response(('index.html', locals()), {'invoices_list': invoices_list ,'invoice_number':invoice_number, 'invoice_name':invoice_name, 'invoice_gross':invoice_gross, 'payment_date':payment_date, 'owing': owing}, context_instance=RequestContext(request))

РЕДАКТИРОВАТЬ: Вот мой шаблон.Дело в том, что функция owing отсутствует в моих моделях, поэтому выражение {{invoices.owing}} не сработает.

  {% for invoices in invoices_list %}
        <tr>
        <td>{{invoices.invoice_number}}</td>
        <td>{{invoices.invoice_contact}}</td>
    <td>{{invoices.client_contract_number}}</td>
        <td>{{invoices.payment_date|date:"d M Y"}}</td>
        <td>{{invoices.invoice_gross}}</td>
    <td>{{owing}}</td>
   {% endfor %} 

Ответы [ 2 ]

1 голос
/ 07 января 2011

Вы получаете только значение owing для первой записи.Посмотрите:

Сначала вы получите все счета:

invoices_list = Invoice.objects.all()

Хорошо.Но затем, в invoice_name, вы срезаете список и берете только первый элемент (invoices_list[0]) и получаете имя из этого.Вы делаете то же самое для invoice_gross:

invoice_gross = invoices_list[0].invoice_gross

Видите?Вы получаете invoice_gross только для первого возвращенного элемента (invoices_list[0]).Вы также получаете только дату для первой записи:

payment_date = invoices_list[0].payment_date

Затем вы сравниваете эту дату и устанавливаете owing в invoice_gross, что, опять же, является invoice_gross для первая запись .Затем вы передаете owing в шаблон.

По сути, в шаблоне (или в представлении, в зависимости от того, что проще / лучше), вам нужно пройти по каждой записи и получитьзначение owing для каждой отдельной записи.

Обновление

Как показано в коде шаблона, вы используете только значение owing для первой записи.,Вам, вероятно, потребуется написать пользовательский шаблонный фильтр , который вычисляет owing для данной записи, так что вы можете сделать:

<td>{{ invoices|owing }}</td>
0 голосов
/ 08 января 2011

Это довольно просто: вы определяете owing один раз в своем представлении, а затем ссылаетесь на него в цикле снова и снова.

По вашему мнению, owing всегда будет 0 или none (я думаю, что ваш код имеет неправильный отступ, поскольку у вас есть if foo: owing=0 else: owing=0

Вот что ябудет делать:

Вариант 1: В представлении

Вы можете рассчитать задолженность для каждого элемента в вашем представлении, добавив вычисленное значение к вашему экземпляру объекта. Это объект Python, который вы можете сделать с.

def homepage(request):
    invoices_list = Invoice.objects.all()
    invoice_name = invoices_list[0].client_contract_number.client_number.name
    invoice_gross = invoices_list[0].invoice_gross
    payment_date = invoices_list[0].payment_date

    def calculate_owing(invoice):
        if invoice.payment_date <= datetime.now():
            invoice.owing = invoice.invoice_gross
        else:
            invoice.owing = 0
        return invoice

    invoices_list = [calculate_owing(invoice) for invoice in invoices_list]
    return render_to_response(('index.html', locals()), {'invoices_list': invoices_list ,'invoice_number':invoice_number, 'invoice_name':invoice_name, 'invoice_gross':invoice_gross, 'payment_date':payment_date, 'owing': owing}, context_instance=RequestContext(request))

Шаблон:

{% for invoices in invoices_list %}
        <tr>
        <td>{{invoices.invoice_number}}</td>
        <td>{{invoices.invoice_contact}}</td>
        <td>{{invoices.client_contract_number}}</td>
        <td>{{invoices.payment_date|date:"d M Y"}}</td>
        <td>{{invoices.invoice_gross}}</td>
        <td>{{invoices.owing}}</td>
{% endfor %}

Вариант 2: в модели

Определение функции для получения owing в модели.

class MyModel(models.Model):
    # model def

    @property
    def owing(self):
        if self.payment_date <= datetime.now():
            owing = self.invoice_gross
        else:
            owing = 0
        return owing

В этот момент шаблон будет выглядеть точно так же - доступ должен {{myinstance.owing}}

...