Django,如何在Listview上显示2个模型

问题描述

我正在处理我的第一个Django项目

**model.py**
class product(models.Model):
    product_code = models.CharField(max_length=15,unique=True)
    product_name = models.CharField(max_length=100)

class stock_product(models.Model):
    product_code = models.CharField(max_length=15)
    branch_code = models.CharField(max_length=5)
    quantity  = models.IntegerField(default=0)                          
    price = models.DecimalField(default=0)

**views.py**
class productList(ListView):
    model = product
    template_name = 'product/product_list.html'
    def get_queryset(self):
        queryset = super(productList,self).get_queryset()
        self.filterset = productFilter(self.request.GET,queryset=queryset)
        return self.filterset.qs
    def get_context_data(self,**kwargs):
        context = super().get_context_data(**kwargs)
        context['filter'] = self.filterset
        return context

**product_list.html**
    {% for alist in product_list %}
        <tr>
            <td>{{ alist.product_code }}</td>
            <td>{{ alist.product_name }}</td>
            <td>{{ alist.price }}</td>
            <td>{{ alist.quantity }}</td>
    </tr>
    {% endfor %}

表格中的样本数据

**product**
['11111','paper'
 '22222','Wood']
**stock_product**
['11111','BR1',150,10
 '11111','BR2',120,'BR3',100,15
 '22222',50,200
 '22222',70,40,250]

我想从stock_product模型中获取价格和数量,我们可以按用户更改branch_code 我们如何做Plese帮助。 谢谢,但是我想只显示用户分支(如果用户分支“ BR1”仅显示“ BR1”)

解决方法

**views.py**
class productList(ListView):
    model = product
    template_name = 'product/product_list.html'
    def get_queryset(self):
        queryset = super(productList,self).get_queryset()
        self.filterset = productFilter(self.request.GET,queryset=queryset)
        return self.filterset.qs

    def get_context_data(self,**kwargs):
        context = super().get_context_data(**kwargs)
        stock = stock_product.objects.all(). # this line added
        context['filter'] = self.filterset
        context['stock'] = stock  # this line added
        return context

现在,您可以从模板访问stock

**product_list.html**
{% for alist in product_list %}
    <tr>
        <td>{{ alist.product_code }}</td>
        <td>{{ alist.product_name }}</td>
        <td>{{ alist.price }}</td>
        <td>{{ alist.quantity }}</td>
    </tr>
{% endfor %}
{% for s in stock %}
    <tr>
        <td>{{ s.product_code }}</td>
        <td>{{ s.product_branch }}</td>
    </tr>
{% endfor %}

但是我不建议您这样做。为什么?好吧,我想您想匹配product_code。除此之外,您应该在模型上使用ForeignKey,因此您将拥有非常简单的代码和逻辑:

型号:

class stock_product(models.Model):
    product = models.ForeignKey(Product,on_delete=models.CASCADE)  # this
    branch_code = models.CharField(max_length=5)
    quantity  = models.IntegerField(default=0)                          
    price = models.DecimalField(default=0)

现在,无需修改视图,您可以在模板上执行此操作以访问数据:

模板:

{% for alist in product_list %}
    <tr>
        <td>{{ alist.product_code }}</td>
        <td>{{ alist.product_name }}</td>
        <td>{{ alist.stock_product.branch_code }}</td>
        <td>{{ alist.stock_product.quantity }}</td>
        <td>{{ alist.stock_product.price }}</td>
    </tr>
{% endfor %}
,

如何使用外键更改模型。 并使用django_tables2

# **model.py**
from django.db import models
class product(models.Model):
    product_code = models.CharField(max_length=15,unique=True)
    product_name = models.CharField(max_length=100)

class stock_product(models.Model):
    # product_code = models.CharField(max_length=15)
    product = models.ForeignKey(product,on_delete=models.CASCADE)
    branch_code = models.CharField(max_length=5)
    quantity  = models.IntegerField(default=0)                          
    price = models.DecimalField(default=0)

这是django_tables2的表代码。

class DetailedDataTable(tables.Table):
    product_code = tables.Column(verbose_name='product_code',accessor='product_id')
    product_name = tables.Column(verbose_name='product_name',accessor='product_id')

    class Meta:
        model = stock_product
        template_name = "django_tables2/bootstrap.html"
        fields = ('product_code','product_name','branch_code','quantity','price')
        
    def render_product_code(self,value,record):
        return product.objects.get(id=value).product_code

    def render_product_name(self,record):
        return product.objects.get(id=value).product_name

这是视图

def view(request):
    template_name = 'template.html'
    query_set = stock_product.objects.all()
    table = DetailedDataTable(qs)
    context={
        'table':table,}
    return render(request,template_name,context)

这是供模板页面使用的。

{# tutorial/templates/tutorial/people.html #}
{% load render_table from django_tables2 %}
<!doctype html>
<html>
    <head>
        <title>List</title>
    </head>
    <body>
        {% render_table table %}
    </body>
</html>

:)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...