python - 如何在没有 django 预建表单的情况下使用视图填充 manytomanyfield ?
问题描述
我正在使用django构建一个存储Web系统,我对框架非常新手,所以问题是,有一个业务规则,它需要两种产品,内部产品和成品。而成品,总是由一个或多个内部产品组成,我有使用manytomanyfields的想法,但是现在,我真的不知道如何提取这些数据,应该是多选,从表格和保存在数据库中,有没有人有任何提示或更好的想法?
模型.py
class Produto(models.Model):
codigo = models.CharField(max_length=254, null=True)
produto_desc = models.CharField(max_length=200, null=False)
tipo = models.CharField(max_length=2)
qtd = models.IntegerField(null=True, default=0)
created = models.DateTimeField(default=timezone.now, editable=False)
last_updated = models.DateTimeField(default=timezone.now, editable=False)
#Relationship Fields
estrutura = models.ManyToManyField(
'storage.Produto',
related_name="produto"
)
def __str__(self):
return self.produto_desc
视图.py
def CadastroProd(request):
temp = 0
lista_produto = Produto.objects.order_by('id')[:20]
for i in lista_produto:
temp += 1
if request.method == 'POST':
form = NovoProduto(request.POST)
if form.is_valid():
obj = Produto()
obj.save(commit=False)
obj.codigo = form.cleaned_data['codigo']
obj.produto_desc = form.cleaned_data['produto_desc']
obj.tipo = form.cleaned_data['tipo']
# obj.estrutura = form.cleaned_data['estrutura']
obj.save()
return HttpResponseRedirect('/storage/produtos')
lista_produto = Produto.objects.order_by('id')[:20]
lista_pi = Produto.objects.filter(tipo='PI')
lista_pa = Produto.objects.filter(tipo='PA')
context = {'lista_produto': lista_produto,
'temp': temp,
'lista_pi': lista_pi, 'lista_pa': lista_pa,
}
return render(request, 'storage/cadproduto/cadproduto.html', context)
表格.py
class NovoProduto(forms.Form):
codigo = forms.CharField(label='codigo', max_length=254)
produto_desc = forms.CharField(label='produto_desc', max_length=100)
tipo = forms.CharField(label='tipo', max_length=2)
estrutura = forms.IntegerField()
指数
<div class="row">
<div class="col-md-3 mb-3">
<label for="pi-ida">Composição de Produtos Internos</label>
<select name="estrutura" multiple id="id_estrutura" required>
{%for prod in lista_pi%}
<option value="{{prod.id}}">{{prod.produto_desc}}</option>
{% endfor %}
</select>
</div>
</div>
<hr class="mb-4">
<button class="btn btn-primary btn-lg btn-block" type="submit">Cadastrar</button>
我希望我能得到产品的信息,以及组成它的产品的信息
解决方案
您正在使用自己的自定义模板,因此使用getlist()方法获取选定的选项列表,并使用set()方法保存这样的 manytomany 字段 此外,如果表单有效,您需要保存表单
if request.method == 'POST':
form = NovoProduto(request.POST)
estrutura = request.POST.getlist('estrutura')
if form.is_valid():
obj=form.save(commit=False)
obj.codigo = form.cleaned_data['codigo']
obj.produto_desc = form.cleaned_data['produto_desc']
obj.tipo = form.cleaned_data['tipo']
# obj.estrutura = form.cleaned_data['estrutura']
obj.save()
obj.estrutura.set(estrutura)
return redirect....
推荐阅读
- mysql - 在我的本地主机上看不到 phpmyadmin 数据库 [MacOS]
- reactjs - 更改抽屉中的背景颜色 - MUI
- oracle - Oracle Apex 映像未在 Internet Explorer 中显示
- git - 删除 Git repo 无法再克隆,因为 repo 仍然存在
- c# - 如何读取 .lwl 扩展文件并触发 HMI(用 C# 编程)在没有 loftware 软件的 SATO s84-ex 打印机中打印出条形码文件
- typescript - TypeScript - Reduce 的返回类型只有可选字段
- c - 在简单程序中理解 Valgrind 行为
- flutter - 以编程方式更改 Flutter 上的鼠标光标
- c - 插入c中的链表时值错误
- c# - 如何在 C# aspnet 中检查下拉列表是否存在