user10931108
user10931108

Reputation:

How to update data in django model to title case in views?

I'm trying to change a column of strings like 'HOSPITAL ZERO', "HOSPITAL ONE" from the database into title case or 'Hospital zero' in the views.py or models.py. I've tried both and can't get either to work for me.

Here is my code in views.py. Column is in Hospital Model under name, i.e. Hospital.name.

def results(request):
    if request.method == "GET":
      Q=()
      out_words = request.GET.get('s')
      context = RequestContext(request)
      #here is where I tried to change it
      qs = Price.objects.annotate(hospital__name=Lower('hospital__name'))
      table = PriceTable(qs.filter(service__desc_us__icontains = out_words))
      RequestConfig(request, paginate={'per_page': 10}).configure(table)
      RequestConfig(request).configure(table)
    else:
      table = PriceTable(Price.objects.all())
      RequestConfig(request).configure(table)

    return render(request, 'results.html', {'table': table})

Here is how I tried in model.py.

    class Hospital(models.Model):
        """Model representing Hospitals."""
        hid = models.CharField(max_length = 8, null=True)
        name = models.CharField(max_length=200, primary_key=True)
        hopid = models.UUIDField(default=uuid.uuid4, help_text='Unique ID for this particular hospital in database')
        address = models.CharField(max_length = 200, null = True)


        class Meta:
            ordering = ['hopid']
        #here is where i tried to update it
        def save(self, *args, **kwargs):
            self.name = self.name.title()
            return super(Hospital, self).save(*args, **kwargs)

        def __str__(self):
            """String for representing the Model object."""
            return f'{self.name} ({self.address})'

class Price(models.Model):
  """Model with all the hospital prices by service."""
  priceid = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Unique ID for this particular service in database')
  comments = models.CharField(max_length = 200, blank = True, null =True)
  hospital = models.ForeignKey("Hospital", on_delete=models.SET_NULL, null=True)

  class Meta:
      ordering =['priceid']


  def __str__(self):
      return f'{self.hospital.name} (...)'

Upvotes: 1

Views: 1640

Answers (3)

Wariored
Wariored

Reputation: 1343

You can try this:

"HOSPITAL ONE".lower().capitalize()

my_string.lower().capitalize()

Here is an option:

def save(self, *args, **kwargs):
        self.name = self.name.lower().capitalize()
        return super(Hospital, self).save(*args, **kwargs)

Upvotes: 1

webbyfox
webbyfox

Reputation: 1069

Just add method to model:

def get_title_case_name(self):
        return self.name.title()

In views/template you can run this method against model object.

Upvotes: 0

Sam
Sam

Reputation: 2084

Here's a new method for your Hospital model called get_title_case_name. Now you can access a hospital name by calling hospital_instance.get_title_case_name().

class Hospital(models.Model):
    """Model representing Hospitals."""
    hid = models.CharField(max_length = 8, null=True)
    name = models.CharField(max_length=200, primary_key=True)
    hopid = models.UUIDField(default=uuid.uuid4, help_text='Unique ID for this particular hospital in database')
    address = models.CharField(max_length = 200, null = True)


    class Meta:
        ordering = ['hopid']

    def __str__(self):
        """String for representing the Model object."""
        return f'{self.name} ({self.address})'

    def get_title_case_name(self):
        return self.name.capitalize()

Upvotes: 0

Related Questions