Django - 如何在一个视图中保存多个对象

时间:2015-08-02 00:34:12

标签: python django view

我遇到了问题,我找不到办法。我找到了这篇文章,但无法使其发挥作用。 Create django object using a view with no form

我收到以下错误

  

/ work_orders / new_order /'module'对象中的AttributeError没有   属性'OrderMovements'

这是代码

models.py

from django.db import models

# Importamos los movimientos disponibles
from .choices import *
# Importaos Stores y Clients
from client.models import Client
from store.models import Store


# Create your models here.
class WorkOrder(models.Model):
    fk_client = models.ForeignKey(Client)
    fk_store = models.ForeignKey(Store)
    sector = models.IntegerField(choices=SECTOR_CHOICES, default=1)
    article = models.CharField(max_length=20)
    serial = models.CharField(max_length=25)
    work = models.CharField(max_length=20)
    article_details = models.CharField(max_length=255)
    cash_advance = models.DecimalField(max_digits=6, decimal_places=2,
                                       default=0)
    initial_price = models.DecimalField(max_digits=6, decimal_places=2,
                                        default=0)
    randpassw = models.CharField(default='12345', max_length=5, blank=True,
                                 null=True)
    warranty = models.PositiveSmallIntegerField(default=0, blank=True,
                                                null=True)
    last_status = models.IntegerField(choices=STATUS_CHOICES, default=1)

    def get_id(self, obj):
        return obj.id


class OrderMovements(models.Model):
    fk_workorder = models.ForeignKey(WorkOrder)
    status = models.IntegerField(choices=STATUS_CHOICES, default=1)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)

    def __str__(self):
        return self.status

和views.py中的视图

def new_order(request):
    if not request.user.is_authenticated():
        return redirect('auth_login')

    title = "Nueva Orden de trabajo"
    store = request.user.userprofile.fk_store

    if 'dni_cuit' in request.session:
        dni_cuit = request.session.get('dni_cuit')
        if Client.objects.get(dni_cuit=dni_cuit):
            dni_cuit = request.session.pop('dni_cuit')
            client = Client.objects.get(dni_cuit=dni_cuit)
            form = NewOrderForm(request.POST or None,
                                initial={'fk_store': store,
                                         'fk_client': client})
            context = {
                       "title": title,
                       "form": form
                      } 
        else:
            return redirect('new_client')
    else:
        form = NewOrderForm(request.POST or None,
                            initial={'fk_store': store})
        context = {
                       "title": title,
                       "form": form
                      }

    # Si el formulario es valido guardamos el contenido
    if form.is_valid():
        order = form.save(commit=False)
        # Generamos el password aleatorio y lo guardamos en la instancia
        randpassw = get_random_string(length=5,   allowed_chars='abcdefghijclmnopqrstuvwxyz0123456789')
        order.randpassw = randpassw
        # Guardamos el nuevo registro (nueva orden de trabajo)
        order.save()

        # Tomamos el ID de la orden generada y lo guardamos en variable
        order_last_id = WorkOrder.objects.latest('id')

        # Si la orden fue generada en CuyoTek se guarda como recibida en Cuyotek
        if str(store) == "CuyoTek":
            # Status 3 es "Recibida en Cuyotek"
            order_movement = models.OrderMovements(fk_workorder=order_last_id,
                                                   status=3)

        # Si la orden no fue generada por un asociado de CuyoTek se registra
        # como "En Tienda Asociada"
        else:
            order_movement = models.OrderMovements(fk_workorder=order_last_id,
                                                   status=2)

        order_movement.save()

        context = {
                   "title": "Orden Creada",
        }

    return render(request, "workorders/new_order.html", context)

我要做的就是这个。当用户创建一个新的WorkOrder时,我必须在模型OrderMovements中保存一个新的寄存器,其中创建了工作订单的id。如果用户的商店是CuyoTek,则状态为“3”,否则为“2”。

但这不起作用。

1 个答案:

答案 0 :(得分:1)

这是完整的views.py

from django.shortcuts import render, redirect

from .forms import *

from .models import *
from client.models import Client
# Importamos libreria para crear cadena aleatoria
from django.utils.crypto import get_random_string


# Create your views here.
def index(request):
    if not request.user.is_authenticated():
        return redirect('auth_login')

    title = "Lista de Ordenes"
    queryset = WorkOrder.objects.all()

    context = {
               'title': title,
               'queryset': queryset,
              }

    return render(request, "workorders/index.html", context)


def new_order(request):
    if not request.user.is_authenticated():
        return redirect('auth_login')

    title = "Nueva Orden de trabajo"
    store = request.user.userprofile.fk_store

    if 'dni_cuit' in request.session:
        dni_cuit = request.session.get('dni_cuit')
        if Client.objects.get(dni_cuit=dni_cuit):
            dni_cuit = request.session.pop('dni_cuit')
            client = Client.objects.get(dni_cuit=dni_cuit)
            form = NewOrderForm(request.POST or None,
                                initial={'fk_store': store,
                                         'fk_client': client})
            context = {
                       "title": title,
                       "form": form
                      }
        else:
            return redirect('new_client')
    else:
        form = NewOrderForm(request.POST or None,
                            initial={'fk_store': store})
        context = {
                       "title": title,
                       "form": form
                      }

    # Si el formulario es valido guardamos el contenido
    if form.is_valid():
        order = form.save(commit=False)
        # Generamos el password aleatorio y lo guardamos en la instancia
        randpassw = get_random_string(length=5, allowed_chars='abcdefghijclm' +
                                                              'nopqrstuvwxyz' +
                                                              '0123456789')
        order.randpassw = randpassw
        # Guardamos el nuevo registro (nueva orden de trabajo)
        order.save()

        # Tomamos el ID de la orden generada y lo guardamos en variable
        order_last_id = WorkOrder.objects.latest('id')

        # Si la orden fue generada en CuyoTek se guarda como recibida en Cuyote
        if str(store) == "CuyoTek":
            # Status 3 es "Recibida en Cuyotek"
            order_movement = models.OrderMovements(fk_workorder=order_last_id,
                                                   status=3)
        # Si la orden no fue generada por un asociado de CuyoTek se registra
        # como "En Tienda Asociada"
        else:
            order_movement = models.OrderMovements(fk_workorder=order_last_id,
                                                   status=2)

        order_movement.save()

        context = {
                   "title": "Orden Creada",
        }

    return render(request, "workorders/new_order.html", context)

谢谢,感谢建议的编辑,帮助我逐步提高我的英语水平