Сохранение данных ManyToMany в Django 3 - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь сохранить данные в django с полями ManyToMany через django - bootstrap -modal-forms для модальных форм, но безуспешно. Я пытался переопределить метод сохранения, но kwargs['instance'] всегда возвращает пустой диктант поля ManyToMany ('suppliers'):

{'name': 'product_1', 'all_suppliers': <QuerySet []>, 'suppliers': <QuerySet []>}

Я пытаюсь добиться обновления suppliers для product и / или обновление products из supplier

Абсолютно новый для Django, поэтому, пожалуйста, извините за плохой стиль программирования

Не могли бы вы помочь мне. Спасибо!

Вот мой код:

models.py

# models.py
class Product(models.Model):
    name = models.CharField(unique=True, max_length=100)
    active = models.BooleanField(default=True)

    def __str__(self):
        return self.name


class Supplier(models.Model):
    name = models.CharField(unique=True, max_length=100)
    supplier_products = models.ManyToManyField(Product)

    def __str__(self):
        return self.name

views.py

# views.py
class ProductUpdateView(BSModalUpdateView):
    model = Product
    template_name = 'product/product_update.html'
    form_class = ProductForm
    success_url = reverse_lazy('product_list_view')


class SupplierUpdateView(BSModalUpdateView):
    model = Supplier
    template_name = 'product/supplier_update.html'
    form_class = ProductForm
    success_url = reverse_lazy('supplier_list_view')

forms.py

# forms.py
class ProductForm(BSModalForm):
    all_suppliers = forms.ModelMultipleChoiceField(queryset=Supplier.objects.all(),required=False)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        if kwargs.get('instance'):
            suppliers = kwargs['instance'].supplier_set.all()
            print(type(kwargs['instance']))
            self.fields['suppliers'] = forms.ModelMultipleChoiceField(required=False, queryset=suppliers)

    class Meta:
        model = Product
        fields = ['name', 'notes']
        fields.append('all_suppliers')

Ответы [ 2 ]

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

Я получаю это, и я использую административные экраны, которые, как вы думаете, справились бы с ситуацией добавления нового тега в новый инструмент.

Разрыв ManyToManyField на экранах администратора и не должно быть

0 голосов
/ 26 февраля 2020

Возможно, ваша ошибка в том, что вам нужно сохранить экземпляр продукта перед тем, как добавить в него множество объектов (поставщиков). Посмотрите на это Документация . Я надеюсь помочь вам! =)

Я полагаю, что это примерно так (примите это за основу для поиска):

def save(self, commit=True):
        product = super(ProductForm, self).save(commit=False)

        if commit:
            product.save()
            suppliers = self.cleaned_data['supplier_products']
            for s in suppliers:
               product.suppliers.add(s)
            product.save()

        return product
...