Python 显示4个表单,但最后一个表单不工作
谢谢你抽出时间 我一直在尝试在同一模板上显示4个表单,并根据submit按钮向正确的表单发送POST请求。 前3个工作正常,只有最后一个(Estoque)不保存对象。当我检查请求时,post sims就可以了 views.py: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
@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.