Django Formset:添加现有产品目录中的行



我有一个表单,它有一个允许我添加一些行的表单集。我可以添加一些简单的行。但我也想从产品目录中添加一些产品。

因此过程如下:

  1. 用户创建新的采购订单(工作(
  2. 用户添加行,如下所述(工作(
  3. 用户可以通过按钮从现有产品目录中添加行。然后,用户将浏览或过滤他想要订购的产品,并将其添加到采购订单中

我知道我试图做的是错误的,因为我想函数中不能有两个def get_context_data(self, **kwargs):。能够在我的表单集中添加目录中的产品有什么想法?

非常感谢,

产品列表

型号.py

class BaseProduct(models.Model):
"""
Abstract base product model class providing the base fields and methods
"""

supplier = models.CharField(max_length=300, blank=True, null=True)   
manufacturer = models.CharField(max_length=300, blank=True, null=True)
product_range = models.CharField(max_length=300, blank=True, null=True)
part_number = models.CharField(_('Item Code'), max_length=255, blank=True, null=True)
description = models.CharField(_('description'), max_length=255, blank=True, null=True)

订单视图.py

class OrderCreate(CreateView):
model = Order
template_name = 'accounting/orders/create_order.html'
form_class = OrderForm
success_url = None
def get_context_data(self, **kwargs):
data = super(OrderCreate, self).get_context_data(**kwargs)
if self.request.POST:
data['lines'] = OrderLineFormSet(self.request.POST)
else:
data['lines'] = OrderLineFormSet()
return data
def get_context_data(self, **kwargs):
data = super(OrderCreate, self).get_context_data(**kwargs)
if self.request.POST:
data['productlines'] = OrderProductLineFormSet(self.request.POST)
else:
data['productlines'] = OrderProductLineFormSet()
return data

def form_valid(self, form):
context = self.get_context_data()
lines = context['lines']
with transaction.atomic():
form.instance.created_by = self.request.user
self.object = form.save()
if lines.is_valid():
lines.instance = self.object
lines.save()
return super(OrderCreate, self).form_valid(form)
def get_success_url(self):
return reverse('accounting:detail_order', kwargs={'order_id': self.object.pk})

@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(OrderCreate, self).dispatch(*args, **kwargs)

型号.py

class OrderLine(models.Model):
order = models.ForeignKey('Order', on_delete=models.CASCADE, related_name="has_lines", blank=True, null=True)
order_item = models.CharField(max_length=100, verbose_name="Line", blank=True, null=True)
tax_rate = models.ForeignKey('TaxRate', on_delete=models.CASCADE, blank=True, null=True)
total = models.CharField(max_length=250, blank=True, null=True)
description = models.CharField(max_length=100, blank=True, null=True)
unit_price_excl_tax = models.DecimalField(max_digits=8,decimal_places=2, blank=True, null=True)
quantity = models.DecimalField(max_digits=8,decimal_places=2,default=1, blank=True, null=True)
def total(self):
total = Decimal(str(self.unit_price * self.quantity))
return total.quantize(Decimal('0.01'))

def __unicode__(self):
return self.description
class Meta:
pass

class OrderProductLine(models.Model):
order = models.ForeignKey('Order', on_delete=models.CASCADE, related_name="has_lines", blank=True, null=True)
baseproduct = models.ForeignKey('BaseProduct', on_delete=models.CASCADE, related_name="has_product_lines", blank=True, null=True)
order_item = models.CharField(max_length=100, verbose_name="Product_Line", blank=True, null=True)
tax_rate = models.ForeignKey('TaxRate', on_delete=models.CASCADE, blank=True, null=True)
total = models.CharField(max_length=250, blank=True, null=True)
description = models.CharField(max_length=100, blank=True, null=True)
unit_price_excl_tax = models.DecimalField(max_digits=8,decimal_places=2, blank=True, null=True)
quantity = models.DecimalField(max_digits=8,decimal_places=2,default=1, blank=True, null=True)
def total(self):
total = Decimal(str(self.unit_price * self.quantity))
return total.quantize(Decimal('0.01'))

def __unicode__(self):
return self.description
class Meta:
pass

表单.py

class OrderLineForm(forms.ModelForm):
class Meta:
model = OrderLine
exclude = ()
OrderLineFormSet = inlineformset_factory(
Order, OrderLine, form=OrderLineForm,
fields=['order_item', 'description','quantity','unit_price_excl_tax','tax_rate'], extra=1, can_delete=True
)
class OrderProductLineForm(forms.ModelForm):
class Meta:
model = OrderProductLine
exclude = ()
OrderProductLineFormSet = inlineformset_factory(
BaseProduct, OrderProductLine, form=OrderProductLineForm,
fields=['supplier', 'part_number','quantity','unit_price_excl_tax','tax_rate'], extra=1, can_delete=True
)

要解决视图中的问题,可以将两个get_context_data方法结合起来,但我不确定这是否能解决中的所有问题

def get_context_data(self, **kwargs):
data = super(OrderCreate, self).get_context_data(**kwargs)
if self.request.POST:
data['lines'] = OrderLineFormSet(self.request.POST)
data['productlines'] = OrderProductLineFormSet(self.request.POST)
else:
data['lines'] = OrderLineFormSet()
data['productlines'] = OrderProductLineFormSet()
return data

更一般地说,看起来您正试图利用ModelForm类同时编辑两个模型。最好的方法是让两个模型表单通过同一个表单提交,而不是使用表单集。这里有一个很好的例子,来自这个SO的帖子。您应该能够在这两个链接中找到有关此实现的更多详细信息。

最新更新