[英]Django inlineformset_factory and ManyToManyField field, once again
首先,對不起我的英語! 我對“inlineformset_factory”和“ManyToManyField”有點問題。 也許選項“inlineformset_factory”不是正確的選擇。 我有兩個班級,Prodotti 和 Categoria。 在models.py中有
class Categoria(models.Model):
''' tabella delle Categorie dei prodotti '''
NomeCategoria = models.CharField(max_length=50,blank=True,null=True)
class Prodotti(models.Model):
''' tabella Prodotti a catalogo '''
NomeProdotto = models.CharField(max_length=50,blank=True,null=True)
CategoriaProdotto = models.ManyToManyField(Categoria, related_name='prodotti_categoria')
我需要一個表單來修改特定類別的名稱,es。 Antiossidante,並最終更改具有此類別的 Prodotti 列表。 我嘗試了很多“inlineformset_factory”和“Prodotti.CategoriaProdotto.through”的使用,但我遇到了字段問題,只接受“id”。 IE
ProdottiFormset = inlineformset_factory(Categoria, Prodotti.CategoriaProdotto.through, fields=('id',))
但是,更改類別的名稱不會保存。 這是我的項目:
views.py
def ModificaCategoria(request, pk):
# recuperiamo la categoria da modificare, bisogna passare l'ID
categoria = get_object_or_404(Categoria, pk=pk)
ProdottiFormset = inlineformset_factory(Categoria, Prodotti.CategoriaProdotto.through, fields=('id',))
if request.method == "POST":
form = CategoriaModelForm(request.POST, request.FILES, instance=categoria)
formset = ProdottiFormset(request.POST, instance=categoria)
if formset.is_valid():
formset.save()
return render(request, "dopo_modifica_categoria.html")
# return redirect(...)
else:
categoria = Categoria.objects.get(pk=pk)
form = CategoriaModelForm(instance=categoria)
formset = ProdottiFormset(instance=categoria)
context = {
"form": form,
"formset": formset,
}
return render(request, "modifica_categoria.html", context)
模板:
{% extends 'base.html'%}
{% block head_title %}{{ block.super }} - Modifica categoria{% endblock head_title %}
{% load crispy_forms_tags %}
{% block content %}
<form method="post">
{% csrf_token %}
{{ form.NomeCategoria|as_crispy_field }}
{{ formset.as_p }}
<button type="submit" class="btn btn-primary btn-sm">Modifica</button>
<br>
</form>
{% endblock content %}
和form.py
class CategoriaModelForm(forms.ModelForm):
class Meta:
model = Categoria
fields = "__all__"
非常感謝您的每一個建議!
下一步應該在該類別中創建一個新的類別和 Prodotti。
如果您正在嘗試保存 NomeCategoria,那么目前您正在保存表單集而不是表單。 保存表單,我想這將解決您的問題。
通過修改視圖,我還能夠在該特定類別中保存新產品:
def ModificaCategoria(request, pk):
# recuperiamo la categoria da modificare, bisogna passare l'ID
categoria = get_object_or_404(Categoria, pk=pk)
ProdottiFormset = inlineformset_factory(Categoria, Prodotti.CategoriaProdotto.through, exclude=['id',])
if request.method == "POST":
form = CategoriaModelForm(request.POST, request.FILES, instance=categoria)
formset = ProdottiFormset(request.POST, instance=categoria)
if formset.is_valid() and form.is_valid():
formset.save()
form.save()
return render(request, "dopo_modifica_categoria.html")
else:
categoria = Categoria.objects.get(pk=pk)
form = CategoriaModelForm(instance=categoria)
formset = ProdottiFormset(instance=categoria)
context = {
"form": form,
"formset": formset,
}
return render(request, "modifica_categoria.html", context)
目標!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.