如何将多个参数传递给FBV Django

时间:2018-07-28 00:25:56

标签: django django-models django-templates django-views

我很难独自解决这个问题。

我想创建一个功能类似于“详细视图”的功能,该功能需要获取由三个参数过滤的所有项目

carrito_id

herramienta_id

transaction_id

我想创建这样的东西:

items = Transaccion.objects.filter(carrito_id=pk, herramienta_id=???, id=???? activo =True)

这正是我想要的。所有这些背后的问题是,将触发该调用的视图获取其数据的方式。目的是在类似推车的系统中拥有工具清单,在该系统中可以创建推车,将其分配给员工,并可以从推车中添加或删除工具。我也想保留所有损坏的工具的记录。所以我的模型如下:

项目:此模型具有定义工具的所有公共字段。

工具模型:不是真实名称,因为每个工具都有定义该工具的唯一属性,所以我为自己拥有的每种工具类型和 Item 创建一个模型> class被该类型的所有类继承。 即(class Cutters(Item):)。

Empleados :此表保存员工信息

Carritos :此表与 Employee 具有OneToOne关系,因为carrito只能由一个人拥有,而对 Item 具有ManyToMany关系。 >由于Carrito需要为其分配一个或多个工具

Transaccion :此表按编号和每项的数量记录属于carrito的项

最后两个表 Carritos Transaccion 是我在努力了解自己需要做什么的地方。

由于我有必要添加一个以上自己类型的工具即(2个完全相同的刀具),并且需要能够在损坏时删除其中一个并保持一条记录,我认为我可以使用** Transaccion *表,因为它已经具有分配给所有carritos的所有工具的所有条目,因此我找到了一种查询所有活动项目并汇总每种工具类型的所有数量并将其分组的方法通过herramienta(工具)

cantidades = Transaccion.objects.values('herramienta__description').annotate(Sum('cantidad')).filter(activo=True, carrito_id=pk)

所以这对我打算在此视图上进行的工作有效,我可以获得所需的结果,可以添加新项目,并且数据将正确显示。所以到目前为止,一切似乎都还可以。我想我可以对每个项目执行类似DetailView的操作,并获取属于该项目的所有交易的列表

enter image description here

从图像中可以看到,我从交易表中获得了物品和数量,无论如何,我遇到的问题是单击“ actualizar” 绿色按钮我在哪个按钮上单击总是得到相同的数据集

enter image description here

我知道这是因为我只将pk从模板传递给函数并获得相同的数据,所以我需要您的帮助,以找到更简单的方法(如果有)或解决我的问题的方法。

我的 Carritos 模型:

# =========================================================================== #
#   MODELO PARA CREAR CARRITOS
# =========================================================================== #


class Carritos(models.Model):
    no_carrito = models.CharField(max_length=3, unique=True)
    empleado = models.OneToOneField(Empleados, on_delete=models.CASCADE)
    # empleado = models.ManyToManyField(Empleados,  through='Transaccion')
    items = models.ManyToManyField(Item, through='Transaccion', related_name='herramienta')
    f_creacion = models.DateTimeField(auto_now_add=True)
    f_actualizacion = models.DateTimeField(auto_now=True)
    activo = models.BooleanField(default=True)

    def get_absolute_url(self):
        return reverse('inventario:carrito')#, kwargs={'pk': self.pk})


    class Meta:
        verbose_name_plural = "Carritos"

    def __str__(self):
        return self.no_carrito



class Transaccion(models.Model):

    carrito = models.ForeignKey(Carritos, on_delete=models.CASCADE, related_name='items_carrito')
    herramienta = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='items_carrito')
    cantidad = models.PositiveSmallIntegerField(default=1)
    activo = models.BooleanField(default=True)
    tipo = models.CharField(max_length=14, choices=CONSUMIBLE, blank=True, null=True)
    motivo = models.CharField(max_length=10, blank=True, null=True)


    def get_absolute_url(self):
        return reverse('inventario:carrito')#, kwargs={'pk': self.pk})

我对 Carritos 的看法:

# =========================================================================== #
#   LOGICA PARA CREAR CARRITOS
# =========================================================================== #
# ===================> Logica relacinado con Cortadores <=====================#

def home_carrito(request):
    template_name = 'inventario/carrito/createcarrito.html'
    model  = Carritos

    carritos = Carritos.objects.all()
    if carritos:
        return render(request, template_name, {'carritos':carritos})
    else:
        return render(request,template_name)


class CarritoCreate(CreateView):
    model = Carritos
    fields = [
        'no_carrito',
        'empleado',
        'activo',
    ]

class ItemCreate(CreateView):
    model = Transaccion
    fields = [
        'carrito',
        'herramienta',
    ]


def detalle_carrito(request, pk):
    model = Carritos, Transaccion
    template_name = 'inventario/carrito/detalles_carrito.html'

    carritos = Carritos.objects.filter(pk=pk)
    # GEST ALL TOOLS ASSIGN TO CARRITO'S PK THAT ARE ACTIVE 
    # TRY TO GET ALL ACTIVE ITEMS THAT BELONG TO CARRITO = PK AND AGREGATE TOTAL ITEMS PER TYPE
    cantidades = Transaccion.objects.values('herramienta__description').annotate(Sum('cantidad')).filter(activo=True, carrito_id=pk)
    # print(str(cantidades))    
    # GEST ALL TOOLS ASSIGN TO CARRITO'S PK THAT ARE NOT ACTIVE 

    return render(request,template_name, {'carrito':carritos, 'trans':cantidades})


class CarritoUpdate(UpdateView):
    model = Carritos
    fields = [
        'no_carrito',
        'empleado',
        'activo',
    ]
    template_name_suffix = '_update_form' 



#----------------------------------------------------------------------------------------------
# FUNCTION I NEED TO IMPLEMENT BUT  DONT KNOW HOW 

def detalle_Items(request, pk):
    template_name = 'inventario/carrito/test-template.html'

    items = Transaccion.objects.filter(carrito_id=pk, herramienta_id=pk, activo =True)

    return render(request, template_name, {'items_update':items})



class TransaccionUpdateView(UpdateView):
    model = Transaccion
    fields = [
        'carrito',
        'herramienta',
        'cantidad',
        'tipo',
        'motivo',
        'activo',
    ]
    template_name_suffix = '_update_form' 


class ItemUpdate(UpdateView):
    model = Transaccion
    fields = [
        'carrito',
        'herramienta',
        'cantidad',
        'tipo',
        'motivo',
        'activo',
    ]
    template_name_suffix = '_update_form' 


class ItemDelete(DeleteView):
    model = Transaccion
    success_url = reverse_lazy('item-herramienta')

我的 Carritos

网址
#=================================================================================================================================#
#   ENLACES PARA CARRITOS 
#=================================================================================================================================#


    # # http://<domain.com>/nuevos-articulos/
    path('carritos/', views.home_carrito, name='carrito'),
    path('carritos/nuevo-carrito', views.CarritoCreate.as_view(), name='create-carrito'),
    path('carritos/actualizar-carrito-<int:pk>/', views.CarritoUpdate.as_view(), name='actualizar-carrito'),
    path('carritos/detalle-carrito-<int:pk>/', views.detalle_carrito, name='detalle-carrito'),

    path('carritos/detalle-carrito/crear-herramienta/<int:pk>/', views.ItemCreate.as_view(), name='agregar-herramienta'),

    # path('carritos/detalle-carrito/actualizar-herramienta/<int:pk>/', views.detalle_Items, name='actualizar-herramienta'),
    path('carritos/detalle-carrito/actualizar-herramienta/<int:pk>/', views.detalle_Items, name='actualizar-herramienta'),

    # path('carritos/detalle-carrito/actualizar-herramienta/<int:pk>/<str:h>/', views.ItemUpdate.as_view(), name='item-herramienta'),
    # path('carritos/detalle-carrito/detalle-eliminados/item/delete/<int:pk>', views.ItemDelete.as_view(), name='eliminados'),

还有触发我要生成的视图的模板

{% extends "inventario/base.html" %}


    {% block lista %}
        <div class="container cf">
            <div class="carrito">
                {% if carrito %}
                    {% for c  in carrito %}
                        <div class="side-panel">
                            <div class="info">
                                <p>Carrito:</p> <h1>{{c.no_carrito}}</h1>
                                <p>Asignado a:</p>  <h1>{{c.empleado.nombre}} {{c.empleado.apellido}}</h1>
                                <p>{{c.herramienta}}</p>
                            </div>
                            {% if not eliminados %}
                                <div class="eliminados">

                                    <h2>No hay elementos eliminados</h2>
                                </div>
                            {% endif %}
                            <a href="" class="btn-carrito dec">Ver reporte de da&ntilde;os</a>
                        </div>

                        <div class="side-main">
                            <table id="tablas" class="cf">
                                <tr class="theader">
                                    <td>Contenido de carrito</td>
                                    <td>cantidad</td>
                                    <td>actualizar</td>
                                </tr>
                                {% for i in trans %}
                                    <tr class="list" >
                                        <td>{{i.herramienta__description}}</td>
                                        <td>{{i.cantidad__sum}}</td>

                                        <td><a href="{% url 'inventario:actualizar-herramienta' pk=c.pk %}" class="btn-lista inc">Actualizar</a></td>       
                                    </tr>
                                {% endfor %}
                            </table>
                            <a href="{% url 'inventario:agregar-herramienta' pk=c.pk %}" class="btn-carrito">Agregar</a>
                        </div>
                    {% endfor%}
                {% else %}
                    <h1>No hay articulos por vencer</h1>
                {%endif%}
            </div>
        </div>

    {% endblock lista%}

0 个答案:

没有答案