如何在Django中根据N动态生成文本框并处理request.POST数据
Solução para Gerar N Campos Dinâmicos e Processar Dados no Django
Passo 1: Atualizar a View (views.py)
Substitua sua função valores por essa versão, que lida com a entrada de N, geração de campos e processamento dos dados:
def valores(request): if request.method == 'POST': # Tratar envio do número N if 'N' in request.POST: try: N = int(request.POST['N']) if N <= 0: return render(request, 'pacote.html', {'res': 'N deve ser um número positivo.'}) # Passar N e intervalo para o template gerar campos return render(request, 'pacote.html', {'N': N, 'range_N': range(N)}) except ValueError: return render(request, 'pacote.html', {'res': 'Por favor, insira um número válido para N.'}) # Tratar envio dos valores de peso e preço else: peso_unitario = [] preco_unitario = [] try: N = int(request.POST['N']) except (KeyError, ValueError): return render(request, 'pacote.html', {'res': 'Erro ao processar N.'}) for i in range(N): peso_key = f'peso_u_{i}' preco_key = f'preco_u_{i}' peso_u = request.POST.get(peso_key, '') preco_u = request.POST.get(preco_key, '') if not peso_u.isdigit() or not preco_u.isdigit(): return render(request, 'pacote.html', { 'res': f'Apenas números são permitidos no par {i+1}.', 'N': N, 'range_N': range(N) }) peso_unitario.append(int(peso_u)) preco_unitario.append(int(preco_u)) # Preparar valores combinados para o template valores_combinados = list(zip(peso_unitario, preco_unitario)) return render(request, 'pacote.html', { 'valores': valores_combinados, 'N': N, 'range_N': range(N) }) # Requisição GET: exibir formulário inicial de N return render(request, 'pacote.html')
Passo 2: Atualizar o Template (pacote.html)
Esse template exibe o formulário de N, gera os campos dinâmicos e mostra os resultados:
<!DOCTYPE html> <html> <head> <title>Gerenciar Valores</title> </head> <body> {% if res %} <p style="color: red;">{{ res }}</p> {% endif %} <!-- Formulário inicial para inserir N --> {% if not N and not valores %} <form method="POST"> {% csrf_token %} <label for="N">Número de pares de campos:</label> <input type="number" name="N" id="N" min="1" required> <button type="submit">Gerar campos</button> </form> {% endif %} <!-- Campos dinâmicos para peso e preço --> {% if N and not valores %} <form method="POST"> {% csrf_token %} <input type="hidden" name="N" value="{{ N }}"> <h3>Preencha {{ N }} pares de valores:</h3> {% for i in range_N %} <div style="margin: 10px 0;"> <label>Par {{ i+1 }}:</label> <input type="number" name="peso_u_{{ i }}" placeholder="Peso" min="1" required> <input type="number" name="preco_u_{{ i }}" placeholder="Preço" min="1" required> </div> {% endfor %} <button type="submit">Enviar valores</button> </form> {% endif %} <!-- Exibir resultados --> {% if valores %} <h3>Valores inseridos com sucesso:</h3> <ul> {% for peso, preco in valores %} <li>Peso: {{ peso }}, Preço: {{ preco }}</li> {% endfor %} </ul> <a href="{% url 'valores' %}">Voltar para inserir novo N</a> {% endif %} </body> </html>
Passo 3: Configurar a URL (urls.py)
Certifique-se de que a URL está mapeada corretamente:
from django.urls import path from . import views urlpatterns = [ path('valores/', views.valores, name='valores'), ]
Principais Funcionalidades:
- Sem variáveis globais: Usa variáveis locais para evitar conflitos entre usuários.
- Validação: Verifica que N é um número positivo e que todos os campos de peso/preço são números.
- Campos dinâmicos: Gera N pares de campos usando um loop no template, cada um com um nome único (ex:
peso_u_0,preco_u_1). - Tratamento de erros: Retorna mensagens claras quando há entradas inválidas, mantendo o formulário preenchido para correção.
内容的提问来源于stack exchange,提问作者Lucas Felipe Casagrande de A.
相关产品推荐
相关产品推荐

