Python 我需要一种在基于django函数的列表视图中传递唯一对象id的方法

Python 我需要一种在基于django函数的列表视图中传递唯一对象id的方法,python,django,django-models,django-views,django-templates,Python,Django,Django Models,Django Views,Django Templates,我在这方面已经被耽搁了好几天了,所有的帮助都将被珍视 我有一个基于函数的列表和详细视图,我的详细视图工作得很好,因为我能够传递url末尾的“/str:pk/”,并且请求为(def po_detail(request,pk)),这反过来我能够传递到我的视图函数中,它们都成功地返回我想要的唯一id 我有一个自定义查询集,我已经写了,以帮助我获得一些付款的总额,并返回它在列表和详细信息视图 现在的问题是,我无法获取列表视图页面中的每个唯一项,因为我无法将pk传递到url中,并且请求函数作为我使用它的详

我在这方面已经被耽搁了好几天了,所有的帮助都将被珍视

我有一个基于函数的列表和详细视图,我的详细视图工作得很好,因为我能够传递url末尾的“/str:pk/”,并且请求为(def po_detail(request,pk)),这反过来我能够传递到我的视图函数中,它们都成功地返回我想要的唯一id

我有一个自定义查询集,我已经写了,以帮助我获得一些付款的总额,并返回它在列表和详细信息视图

现在的问题是,我无法获取列表视图页面中的每个唯一项,因为我无法将pk传递到url中,并且请求函数作为我使用它的详细信息函数的对象可以访问pk

为了防止出错,我将id=True,因为当我设置id=id时,它给了我一个错误:“字段'id'需要一个数字,但得到了。”

如果有人能提供提示、建议或解决方案,我将不胜感激

谢谢, 奥耶罗酒店

下面是我的模型

class PurchaseOrder(models.Model):

created_on = models.DateTimeField(auto_now_add=True)
updated_on = models.DateTimeField(auto_now=True)
po_type = models.ForeignKey(PurchaseOrderType, on_delete=models.SET_NULL, null=True)
status = models.CharField(choices=STATUS, max_length=15)
supplier_ID = models.ForeignKey(Supplier, on_delete=models.SET_NULL, null=True)
order_date = models.DateField()
desired_ship_date = models.DateField()
ready_date = models.DateField()
po_amount = models.IntegerField()

def __str__(self):
    return str(self.id)

class PurchaseOrderPayment(models.Model):
po_number = models.ForeignKey(PurchaseOrder, on_delete=models.SET_NULL, null=True)
date = models.DateField()
amount = models.IntegerField()
memo = models.CharField(max_length=200)

def __str__(self):
    return self.memo
下面是我的视图函数

@login_required(redirect_field_name='po_list')
def po_list(request):
po_lists = PurchaseOrder.objects.all()
po_detail = PurchaseOrder.objects.get(id=True)
payment_lists_doc = PurchaseOrderPayment.objects.filter(po_number__id=True)
amount = po_detail.po_amount
paid_amount = PurchaseOrderPayment.objects.filter(po_number=po_detail).aggregate(Sum('amount'))['amount__sum']
balance = amount - paid_amount  

context = {'po_lists':po_lists, 'payment_lists_doc':payment_lists_doc,
'amount':amount, 'paid_amount':paid_amount, 'balance':balance,
'payment_lists_doc':payment_lists_doc
}
return render(request, 'dashboard/po_list.html', context)

@login_required(redirect_field_name='po_detail')
def po_detail(request, pk):
po_detail = PurchaseOrder.objects.get(id=pk)
payment_lists_doc = PurchaseOrderPayment.objects.filter(po_number__id=pk)
document_lists_doc = PurchaseOrderDocument.objects.filter(po_number__id=pk)

amount = po_detail.po_amount
paid_amount = PurchaseOrderPayment.objects.filter(po_number=po_detail).aggregate(Sum('amount'))['amount__sum']

balance = amount - paid_amount

context = {'po_detail':po_detail, 'payment_lists_doc':payment_lists_doc, 
'payment_form':payment_form, 'document_form':document_form, 
'document_lists_doc':document_lists_doc, 
'paid_amount':paid_amount,
'balance':balance, 'amount':amount}

return render(request, 'dashboard/po_detail.html', context)
这是我的列表模板

<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
              <thead>
                <tr>
                  <th>ID</th>
                  <th>CREATED</th>
                  <th>TYPE</th>
                  <th>STATUS</th>
                  <th>SUPPLIER NAME</th>
                  <th>ORDER DATE</th>
                  <th>AMOUNT</th>
                  <th>PAID AMOUNT</th>
                  <th>BALANCE AMOUNT</th>
                </tr>
              </thead>
              <tbody>
                {% for po_list in po_lists %}
                <tr>
                  <td style="cursor: pointer;"><a href="{% url 'po_detail' pk=po_list.pk %}">{{po_list.id}}</a></td>
                  <td>{{po_list.created_on}}</td>
                  <td>{{po_list.po_type}}</td>
                  <td>{{po_list.status}}</td>
                  <td>{{po_list.supplier_ID}}</td>
                  <td>{{po_list.order_date}}</td>
                  <td>{{po_list.po_amount}}</td>
                  <td data-toggle="modal" data-target="#paid_amount_modal" style="cursor: pointer;">
                  {{paid_amount}}
                  </td>
                  <td>{{balance}}</td>
                </tr>
                {% endfor %}
              </tbody>
            </table>

身份证件
创建
类型
地位
供应商名称
订购日期
数量
已付金额
余额
{采购订单列表%中采购订单列表的%
{{po_list.created_on}}
{{po_list.po_type}
{{po_list.status}
{{po_list.supplier_ID}}
{{po_list.order_date}
{{po_list.po_amount}}
{{已付金额}
{{balance}}
{%endfor%}
最后,我的详细信息模板

<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
              <thead>
                <tr>
                  <th>ID</th>
                  <th>CREATED</th>
                  <th>TYPE</th>
                  <th>STATUS</th>
                  <th>SUPPLIER NAME</th>
                  <th>ORDER DATE</th>
                  <th>AMOUNT</th>
                  <th>PAID AMOUNT</th>
                  <th>BALANCE AMOUNT</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td><a href="{% url 'po_edit' pk=po_detail.pk %}">{{po_detail.id}}</a></td>
                  <td>{{po_detail.created_on}}</td>
                  <td>{{po_detail.po_type}}</td>
                  <td>{{po_detail.status}}</td>
                  <td>{{po_detail.supplier_ID}}</td>
                  <td>{{po_detail.order_date}}</td>
                  <td>{{po_detail.po_amount}}</td>
                  <td>{{paid_amount}}</td>
                  <td>{{balance}}</td>
                </tr>
              </tbody>
              <div></div>
            </table>

身份证件
创建
类型
地位
供应商名称
订购日期
数量
已付金额
余额
{{po_detail.created_on}}
{{po_detail.po_type}
{{po_detail.status}
{{po_detail.supplier_ID}}
{{po_detail.order_date}
{{po_detail.po_amount}}
{{已付金额}
{{balance}}
首先,修复错误

po_detail=PurchaseOrder.objects.get(id=True) 付款单=

PurchaseOrderPayment.objects.filter(采购订单编号\uuuu id=True) 金额=采购订单明细。采购订单金额=真

您需要将一个id(整数)传递给这些字段

包括截图, 如果有帮助,请记下我的答案

编辑您的models.py

    class PurchaseOrder(models.Model):
...

    @property
    def get_payments_sum(self):
        return sum(item.get_amount for item in self.items.all())
    
    @property
    def get_balance(self):
        return  self.get_payments_sum - self.po_amount

class PurchaseOrderPayment(models.Model):
    po_number = models.ForeignKey(PurchaseOrder, on_delete=models.SET_NULL, null=True, related_name="items")

    ...

    @property
    def get_amount(self):
        return self.amount 
views.py

请注意,我只是编辑为修复您的问题(金额和余额),所以您必须添加上下文中剩余的任何内容,如“付款清单\单据”

po_lists.html

                  <tbody>
                {% for po_list in po_lists %}
                <tr>
                  <td style="cursor: pointer;"><a href="{% url 'po_detail' pk=po_list.pk %}">{{po_list.id}}</a></td>
                  <td>{{po_list.created_on}}</td>
                  <td>{{po_list.po_type}}</td>
                  <td>{{po_list.status}}</td>
                  <td>{{po_list.order_date}}</td>
                  <td>{{po_list.po_amount}}</td>
                  <td data-toggle="modal" data-target="#paid_amount_modal" style="cursor: pointer;">
                  {{po_list.get_payments_sum}}
                  </td>
                   <td>{{po_list.get_balance}}</td> 
                </tr>
                {% endfor %}
              </tbody>

{采购订单列表%中采购订单列表的%
{{po_list.created_on}}
{{po_list.po_type}
{{po_list.status}
{{po_list.order_date}
{{po_list.po_amount}}
{{po_list.get_payments_sum}}
{{po_list.get_balance}}
{%endfor%}

当然,先生,我已经尝试过了,但是我的get id是一个内置函数。如果您仔细观察,您会发现在po_详细信息视图中使用了相同的逻辑,但由于它已在url中传递,并在视图中沿请求传递,我能够使用它,那么我如何才能在列表视图的po_列表中通过pk并获得相同的ResultThank Dow yousef如果你的解决方案工作得很好,我就得到了窍门。谢谢@yousef,到目前为止,我只是能够投票选出一个答案,并将其标记为已被接受的答案,这是我在您的答案上严格完成的,因为它为我的需求提供了一个惊人的解决方案。谢谢,祝你今天愉快
                  <tbody>
                {% for po_list in po_lists %}
                <tr>
                  <td style="cursor: pointer;"><a href="{% url 'po_detail' pk=po_list.pk %}">{{po_list.id}}</a></td>
                  <td>{{po_list.created_on}}</td>
                  <td>{{po_list.po_type}}</td>
                  <td>{{po_list.status}}</td>
                  <td>{{po_list.order_date}}</td>
                  <td>{{po_list.po_amount}}</td>
                  <td data-toggle="modal" data-target="#paid_amount_modal" style="cursor: pointer;">
                  {{po_list.get_payments_sum}}
                  </td>
                   <td>{{po_list.get_balance}}</td> 
                </tr>
                {% endfor %}
              </tbody>