Как я могу заполнить множество полей, используя представление, без предварительно созданных django форм? - PullRequest
0 голосов
/ 28 октября 2019

Я создаю веб-систему хранения данных с использованием django, я очень новичок в этой среде, поэтому проблема в том, что существует бизнес-правило, которое требует двух видов продуктов, внутренних продуктов и готовыхиз них. И готовые, всегда составленные из одного или нескольких внутренних продуктов, у меня есть идея использовать множество полей, но сейчас я не знаю, как извлечь эти данные, которые должны иметь множественный выбор, из формы исохранить в базе данных, есть ли у кого-нибудь советы или лучшие идеи?

Models.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

Views.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)

forms.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()

index

 <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>

Я ожидал, что смогу получить информацию о продукте, а также о продуктах, которые его составляют

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

В вашем подклассе формы используйте ModelMultipleChoiceField :

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.ModelMultipleChoiceField(queryset=Produto.objects.order_by('id')[:20])

Поле M2M выглядит как самостоятельная ссылка (если у вас нет двух моделей с именем Produto), так что вы можетехотите исключить текущий продукт из списка опций выбора.

Вы можете изменить набор запросов ModelMultipleChoiceField в конструкторе формы:

    def __init__(*args, **kwargs):
        super().__init__(*args, **kwargs)
        if self.instance and self.instance.id:
            self.fields['estrutura'].queryset = Produto.objects.exclude(id=self.instance.id).order_by('id')[:20]
0 голосов
/ 28 октября 2019

Вы используете свой собственный шаблон, поэтому получите список выбранных вариантов, используя метод 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....
...