Murcielago
Murcielago

Reputation: 1005

Django form: Update model values based on user input in one field

I am writing a form to let a user enter a purchase from the template. A couple things need to happen:

  1. the purchase goes to populate a row in the replenishment table
  2. some fields of the replenishment table get updated based on what the user has input

here is what my model look like:

class replenishment(models.Model):
    Id = models.CharField(max_length=100, primary_key=True, verbose_name= 'references')
    Name = models.CharField(max_length=200)
    Quantity = models.FloatField(default=0)
    NetAmount = models.FloatField(default=0)
    SupplierID = models.CharField(max_length=200)
    Supplier = models.CharField(max_length=200)
    SellPrice = models.FloatField(default=0)
    StockOnOrder = models.FloatField(default=0)
    StockOnHand = models.FloatField(default=0)
    
    def __str__(self):
        return self.reference

and the form:

class ProcurementOperationRecord(forms.Form)
    Id = forms.CharField(required=True)
    Quantity = forms.FloatField(required=True)
    NetAmount = forms.FloatField(required=True)
    Supplier = forms.CharField(required=True)
    SellPrice = forms.FloatField(required=True)

I have no clue how to let the user input the values in form and automatically add Quantity to StockOnOrder as well as automatically recognize the SupplierID based on Supplier. At this point I don't know where to start really. At least, is it possible to achieve what I try to do?

Upvotes: 0

Views: 1579

Answers (2)

Javier Buzzi
Javier Buzzi

Reputation: 6818

First, I've changed some things around and added some comments to what and why I did them.

# models/classes in python are singular AND camel cased (99.9%)
class Supplier(models.Model):
    ...

# models/classes in python are singular AND camel cased (99.9%)
class Replenishment(models.Model):
    # attributes are normally lower case and snake cased (99.9%)
    
    # try not to do this, a CharField??, unless you're using a guid? if so use UUIDField()
    # https://docs.djangoproject.com/en/3.1/ref/models/fields/#uuidfield
    id = models.CharField(db_column='Id', max_length=100, primary_key=True, verbose_name='references') 
    name = models.CharField(db_column='Name', max_length=200)
    quantity = models.FloatField(db_column='Quantity', default=0)
    net_amount = models.FloatField(db_column='NetAmount', default=0)
    # deleted your field "Supplier" -- with this change you can join to the other table and get what you need without having to duplicate anything
    supplier = models.ForeignKey(Supplier, db_column='SupplierID')
    sell_price = models.DecimalField(db_column='SellPrice', default=0, max_digits=6, decimal_places=2)  # You're asking for trouble if you keep this as FloatField
    stock_on_order = models.IntegerField(db_column='StockOnOrder', default=0)  # how can you have ordered a .5 for your stock? changed to IntegerField
    stock_on_hand = models.IntegerField(db_column='StockOnHand', default=0)  # how can you have a .5 of your stock? changed to IntegerField

    class Meta:
        db_table = 'replenishment'  # try not to do this either.. let django come up with the name.. unless you're using an existing database/table?

    ...

# models/classes in python are singular AND camel cased (99.9%)
# django has a standard that they normally postfix forms with "Form" at the end of the class (no matter if it's a ModelForm or regular Form)
class ProcurementOperationRecordForm(forms.ModelForm)
    class Meta:
        model = Replenishment
        fields = ('id', 'quantity', 'net_amount', 'supplier', 'sell_price')
        # I would remove the "id", the client shouldn't care or know about it..

Now to create and update. (This would live inside a view)

# creating?
form = ProcurementOperationRecordForm(data=request.POST)
if form.is_valid():
    form.save()
    return redirect(..) or render(..)

# updating?
replenishment = Replenishment.objects.get(id='...something')
form = ProcurementOperationRecordForm(data=request.POST, instance=replenishment)
if form.is_valid():
    form.save()
    return redirect(..) or render(..)

Upvotes: 2

Arjun Shahi
Arjun Shahi

Reputation: 7330

This is just a general idea. You can try something like this.

First get the user input values of quantity and supplier like this from the valid form.

quantity = form.cleaned_data.get('quantity')
supplier = form.cleaned_data.get('supplier')

Then you can update your replenishment model

replenishment.objects.filter(Supplier=supplier).update(StockOnOrder=quantity)

Upvotes: 1

Related Questions