1

我正在 Django 中进行库存控制,我想要一个表单来控制将要执行的操作。如果产品的记录已经存在,它应该更新数量。如果它不存在,它应该为它创建记录。除此之外,一个表单域将有三个选择。一个将表格值添加到查询产品数量,另一个将减去,另一个将更改为表格中的值。

该模型很大,因为我为表单字段设置了一些选项。它是:

from django.db import models
from django import forms
from django.forms import ModelForm

class Produto(models.Model):
    CAMISA = "CM"
    QUADRO = "QD"
    CANECA = 'CN'
    ESCOLHAS_PRODUTO = (
        (CAMISA, 'Camisa'),
        (QUADRO, 'Quadro'),
        (CANECA, 'Caneca'),
    )
    tipo = models.CharField(max_length = 40,
                            choices=ESCOLHAS_PRODUTO,
                            default=CAMISA)

class Camisa(Produto):    

    MASCULINA = 'MA'
    FEMININA_BASICA = 'FB'
    FEMININA_GOLA_V = 'FV'
    INFANTIL = 'IN'
    MODELO_CAMISA = (
        (MASCULINA, 'Masculina'),
        (FEMININA_BASICA, 'Feminina Basica'),
        (FEMININA_GOLA_V, 'Feminina Gola V'),
        (INFANTIL, 'Infantil'),
    )
    modelo = models.CharField(max_length = 50,
                              choices=MODELO_CAMISA,
                              )

    AMARELA = 'AM'
    AZUL_CLARO = 'AC'
    AZUL_ESCURO = 'AE'
    BRANCA = 'BR'
    CINZA = 'CI'
    LARANJA = 'LA'
    MARFIM = 'MA'
    ROSA = 'RO'
    PRETA = 'PR'
    VERDE_MUSGO = 'VM'
    VERMELHA = 'VR'
    CORES_CAMISA = (
        (AMARELA, 'Amarela'),
        (AZUL_CLARO, 'Azul Claro'),
        (AZUL_ESCURO, 'Azul Escuro'),
        (BRANCA, 'Branca'),
        (CINZA, 'Cinza'),
        (LARANJA, 'Laranja'),
        (MARFIM, 'Marfim'),
        (ROSA, 'Rosa'),
        (PRETA, 'Preta'),
        (VERDE_MUSGO, 'Verde Musgo'),
        (VERMELHA, 'Vermelha'),
    )
    cor = models.CharField(max_length = 40,
                                    choices=CORES_CAMISA,
                                    )

    TAMANHO_P = 'TP'
    TAMANHO_M = 'TM'
    TAMANHO_G = 'TG'
    TAMANHO_GG = 'GG'
    TAMANHO_XG = 'XG'
    TAMANHO_02_ANOS = '02'
    TAMANHO_04_ANOS = '04'
    TAMANHO_06_ANOS = '06'
    TAMANHO_08_ANOS = '08'
    TAMANHO_10_ANOS = '10'
    TAMANHO_12_ANOS = '12'
    TAMANHO_14_ANOS = '14'
    TAMANHO_CAMISA = (
        (TAMANHO_P, 'P'),
        (TAMANHO_M, 'M'),
        (TAMANHO_G, 'G'),
        (TAMANHO_GG, 'GG'),
        (TAMANHO_XG, 'XGG'),
        (TAMANHO_02_ANOS, '2 Anos'),
        (TAMANHO_04_ANOS, '4 Anos'),
        (TAMANHO_06_ANOS, '6 Anos'),
        (TAMANHO_08_ANOS, '8 Anos'),
        (TAMANHO_10_ANOS, '10 Anos'),
        (TAMANHO_12_ANOS, '12 Anos'),
        (TAMANHO_14_ANOS, '14 Anos'),
    )
    tamanho= models.CharField(max_length = 50,
                              choices=TAMANHO_CAMISA,
                              )




    quantidade = models.IntegerField()

    def __unicode__(self):
        return self.modelo


class CamisaForm(ModelForm):
    ADICIONAR = 'ADC'
    REDUZIR = 'RED'
    ALTERAR = 'ALT'    
    ACOES = (
        (ADICIONAR, 'Adicionar Quantidade'),
        (REDUZIR, 'Reduzir Quantidade'),
        (ALTERAR, 'Alterar para Quantidade'),        
    )
    acoes = forms.ChoiceField(
                              choices=ACOES,
                              )

    class Meta:
        model = Camisa

以及以下观点:

def index(request):
    produtos_estoque = Camisa.objects.all()
    template = 'estoque/index.html'
    modelos_camisa = {'MA' : 'Masculina Basica','FB' : 'Feminina Basica','FV' : 'Feminina Gola V','IN' : 'Infantil' }
    if request.method == 'POST':
        form = CamisaForm(request.POST)
        if form.is_valid():                
            try:
                produto_atualizar = Camisa.objects.get(modelo = request.POST['modelo'], cor = request.POST['cor'], tamanho = request.POST['tamanho'])            
                if request.POST['acoes'] == 'ADC':
                    produto_atualizar.quantidade = produto_atualizar.quantidade + request.POST['quantidade']
                elif request.POST['acoes'] == 'RED':
                    produto_atualizar.quantidade = produto_atualizar.quantidade - request.POST['quantidade']
                elif request.POST['acoes'] == 'ALT':
                    produto_atualizar.quantidade = request.POST['quantidade']
                produto_atualizar.save()
            except:
                produto_atualizar = form.save()
            return HttpResponseRedirect('')
    else:
        form = CamisaForm()
    return render_to_response(template, { 'form': form, 'produtos_estoque': produtos_estoque,
        'modelos_camisa' : modelos_camisa.iteritems(),  }, context_instance=RequestContext(request))

但实际情况是,表单只是为产品创建了另一条记录,即使它已经存在。不确定模型的其余部分是否对这个问题很重要,如有必要,将发布。有人可以帮我解决这个问题吗?谢谢

4

1 回答 1

1

请发布正在执行的模型 - 它将包含一些有用的信息,例如约束或缺少约束等。好的,很酷,那里没有导致插入违规的唯一约束。

我建议的第一件事是使用表单cleaned_data来访问表单值而不是原始 POST 数据,form.is_valid()做很多工作来将原始数据处理为模型数据的可接受输入。

第二件事是该except子句将捕获我怀疑是您的问题的任何异常...其他错误正在该except子句中创建新记录。具体点,比如except Camisa.DoesNotExist:

第三件事是将这些常量放在模型上,以便您可以从表单和视图中引用它们,而不是文字字符串。这只是一个清洁度/代码风格推荐。

一些清理可能看起来像:

MODELOS_CAMISA = {'MA' : 'Masculina Basica','FB' : 'Feminina Basica','FV' : 'Feminina Gola V','IN' : 'Infantil' }

def index(request):
    produtos_estoque = Camisa.objects.all()

    if request.method == 'POST':
        form = CamisaForm(request.POST)
        if form.is_valid():
            try:
                produto_atualizar = Camisa.objects.get(modelo=form.cleaned_data.get('modelo'), cor=form.cleaned_data.get('cor'), tamanho=form.cleaned_data.get('tamanho'))
                quantidade = form.cleaned_data.get('quantidade')
                acoes = form.cleaned_data.get('acoes')
                if acoes == Camisa.ADC:
                    produto_atualizar.quantidade = produto_atualizar.quantidade + quantidade
                elif acoes == Camisa.RED:
                    produto_atualizar.quantidade = produto_atualizar.quantidade - quantidade
                elif acoes == Camisa.ALT:
                    produto_atualizar.quantidade = quantidade
                produto_atualizar.save()
            except Camisa.DoesNotExist:
                produto_atualizar = form.save()
            return HttpResponseRedirect('')
    else:
        form = CamisaForm()
    return render_to_response('estoque/index.html', { 'form': form, 'produtos_estoque': produtos_estoque,
        'modelos_camisa' : MODELOS_CAMISA.iteritems(),  }, context_instance=RequestContext(request))

(抱歉有任何语法错误,我的葡萄牙语不太好)

这应该足以让您入门,如果您添加更多信息,我可以编辑并详细说明我的答案。祝你好运!

于 2013-07-11T23:48:26.240 回答