Django Создание формы Указанное количество экземпляров формы (элемента) и динамическое присвоение атрибутов - PullRequest
0 голосов
/ 06 мая 2020

У меня есть страница, на которой пользователь может использовать флажок для выбора различных элементов (импортированных из базы данных). После отправки формы я хочу получить список элементов, выбранных пользователем (я использовал поле значения флажка в качестве идентификатора элемента)

Я сделал это с помощью TemplateView и переопределил метод публикации.

class SelectSaleInvoiceItemsFromSo(TemplateView):
    template_name = 'salesApp/selectsiitemfromso.html'
    def get_context_data(self,*args,**kwargs):
        context = super().get_context_data(*args,**kwargs)
        context['so'] = get_object_or_404(SaleOrder, pk=self.kwargs['pk'])
        context['object_list'] = SaleOrderItem.objects.filter(so_number=self.kwargs['pk'])
        return context

    def post(self, request, *args, **kwargs):
        selected_items = request.POST.getlist('selected_items')
        print(selected_items) #just a test
        context = self.get_context_data(*args,**kwargs)
        return self.render_to_response(context) #Just a test

моя модель выглядит так

class SaleOrderItem(models.Model):
    so_line_number = models.IntegerField(verbose_name='Line')
    sale_order_item = models.ForeignKey(Items, on_delete=models.PROTECT,verbose_name='Item')
    so_number = models.ForeignKey(SaleOrder, on_delete=models.CASCADE)
    so_quantity = models.DecimalField(max_digits=14,decimal_places=2,default=0.00,verbose_name='Quantity')
    sale_price = models.DecimalField(max_digits=14,decimal_places=2,verbose_name='Sale Price')
    so_tax_rate = models.ForeignKey(TaxRate, on_delete=models.PROTECT)
    so_item_tax_amount = models.DecimalField(max_digits=14,decimal_places=2,verbose_name='Tax Amount')
    total_price = models.DecimalField(max_digits=14,decimal_places=2,default=0.00)
    variation_number = models.IntegerField(default=0)
    variation_quantity = models.DecimalField(max_digits=14,decimal_places=2,default=0,verbose_name='Variation Quantity')
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.so_line_number)

, а часть HTML выглядит так

<table class="table table-striped table-sm">
        <thead>
            <tr>
                <th>Select</th>
                <th>Line Number</th>
                <th>Description</th>
                <th>UoM</th>
                <th>Quantity</th>
                <th>Price</th>
            </tr>
        </thead>
        {% if object_list %}
          <tbody>
            {% for item in object_list  %}
              <tr>
                  <td>
                    <input type="checkbox" name="selected_items" value={{item.id}}>
                  </td>
                  <td>{{item}}</td>
                  <td>{{item.sale_order_item.item_description}}</td>
                  <td>{{item.sale_order_item.item_uom}}</td>
                  <td>{{item.so_quantity}}</td>
                  <td>{{item.total_price}}</td>
              </tr>
            {% endfor %}
          </tbody>
        {% endif %}
    </table>

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

Я пробовал сделать это с помощью FormView, но мне трудно динамически назначать {{item.id}} в представлении функции, а также в шаблоне html. Кроме того, как сгенерировать экземпляры формы в соответствии с требуемым количеством элементов, возвращаемых в запросе. В любом случае спасибо!

...