Python 显示4个表单,但最后一个表单不工作

Python 显示4个表单,但最后一个表单不工作,python,python-3.x,django,django-models,django-forms,Python,Python 3.x,Django,Django Models,Django Forms,谢谢你抽出时间 我一直在尝试在同一模板上显示4个表单,并根据submit按钮向正确的表单发送POST请求。 前3个工作正常,只有最后一个(Estoque)不保存对象。当我检查请求时,post sims就可以了 views.py: @login_required @allowed_users(allowed_ones=['Admin']) def test_view(request, id): prod = Produto.objects.get(id=id) prod_form

谢谢你抽出时间

我一直在尝试在同一模板上显示4个表单,并根据submit按钮向正确的表单发送POST请求。 前3个工作正常,只有最后一个(Estoque)不保存对象。当我检查请求时,post sims就可以了

views.py:

@login_required
@allowed_users(allowed_ones=['Admin'])
def test_view(request, id):
    prod = Produto.objects.get(id=id)

    prod_form = ProdutoForm()
    img_form = ImagemForm()
    model_form = ProdutoForm()
    storage_form = ProdutoForm()

    prod_query = Produto.objects.all()
    img_query = Imagem.objects.all()
    model_query = Modelo.objects.all()
    storage_query = Estoque.objects.all()

    t1 = 'no'
    t2 = request.POST
    if request.method == 'POST' and 'producting' in request.POST:
        print('PROD')
        prod_form = ProdutoForm(request.POST, instance=prod)
        t1 = 'product'
        t2 = request.POST
        if prod_form.is_valid():
            prod_form.save()

    elif request.method == 'POST' and 'img' in request.POST:
        print('IMG')
        img_form = ImagemForm(request.POST, request.FILES)
        t1 = 'img'
        t2 = request.POST
        if img_form.is_valid():
            img = img_form.save(commit=False)
            img.product = prod
            img.save()

    elif request.method == 'POST' and 'model' in request.POST:
        print('MODEL')
        model_form = ModeloForm(request.POST)
        t1 = 'model'
        t2 = request.POST
        if model_form.is_valid():
            model_form.save()

    elif request.method == 'POST' and 'storge' in request.POST:
        print('STORAGE')
        storage_form = EstoqueForm(request.POST, product=prod)
        t1 = 'storage'
        t2 = request.POST
        if storage_form.is_valid():
            storage_form.save()


    else:
        prod_form = ProdutoForm(instance=prod)
        img_form = ImagemForm()
        model_form = ModeloForm()
        storage_form = EstoqueForm()

    context = {
        'prod': prod,
        'prod_query': prod_query,
        'img_query': img_query,
        'storage_query': storage_query,
        'model_query': model_query,
        'prod_form': prod_form,
        'img_form': img_form,
        'model_form': model_form,
        'storage_form': storage_form,
        't1': t1,
        't2': t2,
    }
    if request.user_agent.is_mobile:
        return render(request, 'amp/test.amp.html', context)
    elif request.user_agent.is_pc:
        return render (request, 'desktop/test.amp.html', context)
    else:
        return render (request, 'test.html', context)

models.py:

class Estoque(models.Model):

    tamanhos = [
        ('Adulto', (
                ('P', 'P'),
                ('M', 'M'),
                ('G', 'G'),
                ('GG', 'GG'),
            )
        ),
        ('Infantil', (
                ('1', 1),
                ('2', 2),
                ('3', 3),
                ('4', 4),
                ('5', 5),
                ('6', 6),
                ('7', 7),
                ('8', 8),
                ('9', 9),
                ('10', 10),
                ('11', 11),
                ('12', 12),
            )
        ),
        ('Calsa', (
                ('36', 36),
                ('38', 38),
                ('40', 40),
                ('42', 42),
                ('44', 44),
                ('46', 46),
                ('48', 48),
                ('50', 50),
            )
        ),
        ('unknown', 'Unknown'),
    ]

    product = models.ForeignKey(Produto, on_delete=models.SET_NULL, null=True, related_name='storage')
    tamanho = models.CharField(max_length=100, choices=tamanhos)
    quantidade = models.PositiveIntegerField(default=0)
    created_time = models.DateTimeField(auto_now=True)
    updated_time = models.DateTimeField(auto_now_add=True)
    objects = EstoqueManager()

    def __str__(self):
        return '%s - %s - %s'% (self.product,self.tamanho, self.quantidade)

    def clean(self):
        stor = Estoque.objects.filter(product=self.product, tamanho=self.tamanho)
        if stor.exists():
            raise ValidationError('Estoque já existente')
        list2 = ['P', 'M', 'G', 'GG']
        list3 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
        if self.product.model.modelo == 'CALSA' and self.product.model.publico == 'Adulto' and self.tamanho not in range(36, 50, 2):
            raise ValidationError('por favor selecione um tamanho para Calsa')
        if self.product.model.modelo != 'CALSA'  and self.product.model.publico == 'Adulto' and self.tamanho not in list2:
            raise ValidationError('por favor selecione um tamanho para Adultos')
        if self.product.model.publico == 'Crianca' and self.tamanho not in list3:
            raise ValidationError('por favor selecione um tamanho para Crianca')
HTML:


{{prod}}
{{t1}
{{prod_query.count}
{%csrf_令牌%}
{{prod_form.as_p}
去
{{img_query.count}
{%csrf_令牌%}
{{img_form.as_p}
{{img_form.errors}}
去
{{model_query.count}
{%csrf_令牌%}
{{model_form.as_p}
{{model_form.errors}
去
{{storage_query.count}
{%csrf_令牌%}
{{storage\u form.as\u p}
{{storage_form.errors}
去
{{t2}

在第四种形式中,不要使用“存储”而使用“产品”,可能是这样的:

elif request.method == 'POST' and 'product' in request.POST:
    storage_form = EstoqueForm(request.POST, instance=prod)
    t1 = 'storage'
    t2 = request.POST
    if storage_form.is_valid():
        storage_form.save()

我不得不面对的问题是,在没有外键字段[product]的情况下显示存储表单(EstoqueForm),然后

if storage_form.is_valid():
     stg = storage_form.save(commit=False)
     stg.product = prod
     stg.save()
我所说的prod是指更新视图id中的de Produto.object。我试过使用instance=prod等。 但真正的问题在于验证表单。在我的模型中,我得到了一个干净的方法,该方法从一个模型中获取一个字段,该模型的Produto是与外键相关的,而Estoque是与Produto相关的外键。最后,我尝试在存储表单上设置de product,然后验证它是否有效,并尝试设置

 storage_form = EstoqueForm(request.POST, initial = {'product': prod}
也不管用。 我得到的解决方案是将field产品放回存储表单。将存储表单打印为,并仅将prod作为要选择的选项

update_product.amp.html

尝试使用else语句中的form.errors和form.non_field_errors在表单上打印错误。这会告诉你出了什么问题。我已经在模板上试过了。它什么也没给我看。你说的其他是什么意思?在通过上下文传递的变量上分配它,并将{{variable}设置到{{storage\u form.as\u p}}下的每个右下方?否,在视图函数中打印错误。if form.is\u valid()//执行其他操作:打印(form.errors)打印(form.non\u字段\u errors)。查看错误是什么。它为模型上的clean方法获取了一个错误。它返回我非类型对象没有模型属性
update_product.amp.html
<form id="storage-form" method="POST" action-xhr="{% url 'update_product' prod.id %}" target="_top" hidden>
    <fieldset>
        {% csrf_token %}
        <p><label for="id_product">Product:</label> <select name="product" required id="
            id_product">
              <option value="{{prod.id}}" selected>{{prod}}</option>
            </select></p>
            <p><label for="id_quantidade">Quantidade:</label> <input type="number" name="quantidade"
             value="0" min="0" required id="id_quantidade"></p>
            <p><label for="id_tamanho">Tamanho:</label> <select name="tamanho" required id="
            id_tamanho">
              <option value="" selected>---------</option>
              <optgroup label="Adulto">
              <option value="P">P</option>
              <option value="M">M</option>
              <option value="G">G</option>
              <option value="GG">GG</option>
              </optgroup>
              <optgroup label="Infantil">
              <option value="1">1</option>
              <option value="2">2</option>
              <option value="3">3</option>
              <option value="4">4</option>
              <option value="5">5</option>
              <option value="6">6</option>
              <option value="7">7</option>
              <option value="8">8</option>
              <option value="9">9</option>
              <option value="10">10</option>
              <option value="11">11</option>
              <option value="12">12</option>
              </optgroup>
              <optgroup label="Calsa">
              <option value="36">36</option>
              <option value="38">38</option>
              <option value="40">40</option>
              <option value="42">42</option>
              <option value="44">44</option>
              <option value="46">46</option>
              <option value="48">48</option>
              <option value="50">50</option>
              </optgroup>
              <option value="unknown">Unknown</option>
            </select></p>
            <h2>{{storage_form.errors}}</h2>
            <h2>{{storage_form.non_field_errors}}</h2>
        <input type="submit" name="storage" value="Submit " />
i understand that probably ain't the right way but was the one that i got for now.