Как вывести таблицу в Django из класса с manytomanyfield для всех полей, выбранных для экземпляра?
Я пытаюсь создать табличное представление в Django 3.2, которое будет отображать данные из экземпляра класса:
class SalesPlan(models.Model):
customer = models.OneToOneField(Customer, null=True, on_delete=RESTRICT)
period = models.DateField()
product = models.OneToOneField(Product, null=True, on_delete=RESTRICT)
qty = models.DecimalField(max_digits=10, decimal_places=2, null=True)
классы для клиента и продукта:
class Customer(models.Model):
customer_code = models.CharField(max_length=6, primary_key=True, unique=True)
customer_name = models.CharField(max_length=100)
belongs_to_sales_channel = models.ForeignKey(SalesChannel, on_delete=RESTRICT)
customer_portfolio = models.ManyToManyField(Product)
date_created = models.DateTimeField(auto_now_add=True, null=True)
class Product(models.Model):
product_group = models.ForeignKey(ProductGroup, on_delete=RESTRICT)
product_subgroup = models.ForeignKey(ProductSubGroup, on_delete=RESTRICT)
item_code = models.CharField(max_length=5, primary_key=True)
item_name = models.CharField(max_length=100)
unit_of_measure = models.CharField(max_length=10)
product_weight = models.DecimalField(max_digits=5, decimal_places=3)
product_weight_text = models.CharField(max_length=10)
Я пробовал представление на основе функций и представление на основе классов. Представление на основе класса дает мне одну строку для одного продукта, поскольку класс SalesPlan установлен таким образом. Есть ли способ вывести строки для каждого продукта в Customer.customer_portfolio.all() со всеми уже установленными данными и только с количеством для ввода пользователем? Я искал похожие примеры, все, что я нашел, это то, что у меня уже есть: представление на основе класса может отображать форму, для одного экземпляра (только одна строка). Мне не удалось использовать набор форм, сейчас я изучаю, возможно ли это с помощью набора форм.
Я нашел решение! Я сделал представление на основе функции, создал форму для модели, затем создал набор форм для этой формы и передал начальные данные следующим образом:
def create_sales_plan(request, pk):
customer = Customer.objects.get(customer_code=pk)
portfolio = customer.customer_portfolio.all()
initial = []
for item in portfolio:
initial.append({'customer': customer, 'product':item})
SalesPlanFormSet = formset_factory(SalesPlanForm, extra=0)
formset = SalesPlanFormSet(initial=initial)
Таким образом, набор форм получает начальные данные, которые представляют собой список dicts, который я создал "вручную". Я очень надеюсь, что это поможет другим людям с похожей или такой же проблемой, так как я не смог легко найти никаких ресурсов. Теперь, когда у меня есть предварительно заполненные формы, я буду играть вокруг, чтобы сделать html форму, удобную для ввода данных (скорее всего, html таблицу).