2013-07-11 8 views
1

장고에서 인벤토리 컨트롤을 만들고 있는데, 수행 할 작업을 제어하는 ​​양식이 필요합니다. 제품 레코드가 이미 존재하면 수량을 업데이트해야합니다. 존재하지 않으면 레코드를 작성해야합니다. 그 외에도 하나의 양식 필드에는 세 가지 선택 사항이 있습니다. 하나는 제품의 수량에 양식 값을 추가하고 다른 하나는 빼기를하고 다른 하나는 양식의 값으로 변경합니다.Django - POST 요청이 올바르게 검색되지 않았습니다.

양식 필드에 대해 몇 가지 선택 사항을 설정했기 때문에 모델이 상당히 큽니다.

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)) 

그러나 일어나는 것은 양식 단지가 이미 존재하는 경우에도, 제품에 대한 또 다른 기록을 만드는 것입니다. 모델의 나머지 부분이이 질문에 대해 중요한지 확실하지 않은 경우 필요한 경우 게시 할 것입니다. 누가 이걸 도와 줄 수있어? 감사합니다

답변

1

여기에 제약이 있거나 부족한 것과 같은 유용한 정보가있을 것입니다. 괜찮아요. 삽입 위반을 유발하는 고유 한 제약이 없습니다.

원시 POST 데이터 대신 양식 cleaned_data을 사용하여 양식 데이터에 액세스하는 것이 가장 좋습니다. form.is_valid()은 원시 데이터를 모델 데이터에 허용되는 입력으로 처리하기위한 많은 작업을 수행합니다.

두 번째 것은 except 절은 내가 당신의 문제가 ... 다른 뭔가가 except 절에 새 레코드를 생성하는 잘못된 것입니다 의심 어떤 예외를 잡을 것입니다. except Camisa.DoesNotExist:

세 번째는 리터럴 문자열 대신 Form 및 View에서 참조 할 수 있도록 해당 상수를 Model에 넣는 것입니다. 이것은 청결/코드 스타일 권장 사항 일뿐입니다. 같은

약간의 정리 보일 수 있습니다 : (내 포르투갈어 크지 않다 어떤 문법 오류에 대해 죄송합니다)

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)) 

더 많은 정보를 추가하는 경우, 당신이 시작하는 데 충분해야한다

I 내 대답을 편집하고 정교하게 해석 할 수 있습니다. 행운을 빕니다!

+0

마크, 너 락! Camisa.ADC를 Camisa 모델의 특성이 아니기 때문에 'ADC'(및 그에 따라 다른 것)로 변경해야했습니다. 정상적으로 작동했습니다. 대단히 감사합니다! – fgalvao

+0

쿨, 기꺼이 도와 드리겠습니다. – markdsievers

관련 문제