Django inlineformset_factory и поле ManyToManyField, еще раз - PullRequest
0 голосов
/ 18 марта 2020

Прежде всего, извините за мой английский sh! У меня есть небольшая проблема с "inlineformset_factory" и "ManyToManyField". Возможно, опция "inlineformset_factory" не является правильным выбором. У меня есть два класса, Продотти и Категория. В 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')

Мне нужна форма для изменения имени специфики c Категория, es. Antiossidante, и в конечном итоге изменить список Prodotti, которые имеют эту категорию. Я очень стараюсь с "inlineformset_factory" и использованием "Prodotti.CategoriaProdotto.through", но у меня есть проблемы с полями, только "id" принимается. т.е.

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 в этой категории.

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Изменяя вид, я также смог сохранить новые продукты в этой категории c:

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) 

Цель!

0 голосов
/ 18 марта 2020

Если вы пытаетесь сохранить NomeCategoria, то в настоящее время вы сохраняете набор форм, но не форму. Сохраните форму, и я думаю, что это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...