Search code examples
djangoinline-formset

Django inline model formset with 2 models


First of all, please forgive for my newbie questions. I did copy most of the code, and try to understand from Django documents.

Code as below:

models.py

class Order(models.Model):
  ORDER_CHOICES = (
      ('import', 'IMPORT'),
      ('export', 'EXPORT')
  )

  storage = models.ForeignKey(Storage, on_delete=models.PROTECT)
  order_type = models.CharField(max_length=6, choices=ORDER_CHOICES)
  created_at = models.DateTimeField(auto_now_add=True)
  updated_at = models.DateTimeField(auto_now_add=True)

class Item(models.Model):
  def random_barcode():
      return str(random.randint(10000000, 99999999))

  type = models.ForeignKey(Type, on_delete=models.CASCADE)
  order = models.ForeignKey(Order, on_delete=models.CASCADE, null=True)
  brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
  item_name = models.CharField(max_length=50, help_text='Name of goods, max 50 characters')
  barcode = models.CharField(max_length=8, default=random_barcode, unique=True)
  production_date = models.DateField()
  expired_date = models.DateField()

  def __str__(self):
      return self.item_type

forms.py

class ItemForm(ModelForm):
  class Meta:
      model = Item
      exclude = ['order',]
      fields = ['type', 'brand', 'item_name', 'production_date', 'expired_date']
ItemFormSet = inlineformset_factory(Order, Item, form=ItemForm, extra=1)

views.py

class CreatePO(CreateView):
  model = Order
  context_object_name = 'orders'
  template_name = 'storages/create_po.html'
  fields = ['order_type', 'storage',]
  *#dun't know how to write below code....*

1st question: how to use inline formset to write the CreatePO view?

2nd question: I need my create PO template as below picture, how to add a "Quantity" field? This kind of template need Javascript, right? Any alternative solution? I have no knowledge with javascript.

enter image description here


Solution

  • First of all, move the def random_barcode(): before def __str__(self): it looks so ugly formated code.

    Then let's have a look in your pic, if you haven't proper experience with Javascript you can use Admin Views from Django, it's much more simple and supported by Django 2.1. Read more if you would like to give permission to everyone in a admin-views page https://docs.djangoproject.com/el/2.1/releases/2.1/#model-view-permission

    So quantity will be just added inside Item class

    quantity = models.PositiveSmallIntegerField(default=1)
    

    Also for your form, in my opinion, you need modelform_factory, so I suggest to read this one https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#modelform-factory-function