String representation with __str__ in Django models
📖 Scenario: You are building a simple Django app to manage a library's book collection. Each book has a title and an author.When you view the list of books in the Django admin or in the Django shell, you want to see a friendly name for each book instead of the default object representation.
🎯 Goal: Create a Django model called Book with fields for title and author. Then add a __str__ method to return a readable string like "Title by Author".
📋 What You'll Learn
Create a Django model named Book with title and author fields
Add a __str__ method to the Book model
The __str__ method should return a string formatted as "{title} by {author}"
Use exact variable and method names as specified
💡 Why This Matters
🌍 Real World
Customizing the string representation of models helps developers and admins quickly identify records in Django admin and shell.
💼 Career
Knowing how to add __str__ methods is a basic skill for Django developers to improve code readability and user experience.
Progress0 / 4 steps
1
Create the Book model with title and author fields
Create a Django model class called Book with two fields: title and author, both as models.CharField with max_length=100.
Django
Hint
Use class Book(models.Model): to define the model. Use models.CharField(max_length=100) for both fields.
2
Add a __str__ method to the Book model
Add a method called __str__ inside the Book model class that returns a string. For now, return the title field only.
Django
Hint
Define def __str__(self): and return self.title.
3
Update __str__ to include author in the string
Modify the __str__ method to return a string formatted as "{title} by {author}" using an f-string.
Django
Hint
Use an f-string: return f"{self.title} by {self.author}".
4
Complete the model with proper indentation and imports
Ensure the entire Book model code includes the import statement, class definition, fields, and the __str__ method exactly as shown.
Django
Hint
Check that all parts are present and properly indented.
Practice
(1/5)
1. What is the main purpose of defining a __str__ method in a Django model?
easy
A. To create a new database migration
B. To define the database table name
C. To set default values for model fields
D. To provide a readable string representation of the model instance
Solution
Step 1: Understand the role of __str__ in Django models
The __str__ method returns a string that describes the model instance clearly and simply.
Step 2: Identify what __str__ does not do
It does not affect database table names, migrations, or default field values.
Final Answer:
To provide a readable string representation of the model instance -> Option D
Quick Check:
Purpose of __str__ = readable string [OK]
Hint: Think: How do I want to see this object as text? [OK]
Common Mistakes:
Confusing __str__ with database schema settings
Using __str__ to set default field values
Thinking __str__ creates migrations
2. Which of the following is the correct way to define a __str__ method in a Django model?
easy
A. def __str__(self): return self.name
B. def str(self): return self.name
C. def __str__(self): print(self.name)
D. def __string__(self): return self.name
Solution
Step 1: Recall the exact method name and return type
The method must be named __str__ and return a string, not print it.
Step 2: Check each option for correctness
def __str__(self): return self.name correctly defines __str__ and returns self.name. Others have wrong names or use print instead of return.
Final Answer:
def __str__(self): return self.name -> Option A
Quick Check:
Correct method name and return string = def __str__(self): return self.name [OK]
Hint: Remember: __str__ must return a string, not print it [OK]
Common Mistakes:
Using print instead of return inside __str__
Misspelling __str__ method name
Defining __string__ or str instead of __str__
3. Given this Django model:
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
def __str__(self):
return f"{self.title} by {self.author}"
book = Book(title='Django Basics', author='Anna')
print(str(book))
What will be printed?
medium
A. Book object (None)
B. Django Basics
C. Django Basics by Anna
D.
Solution
Step 1: Understand the __str__ method output
The __str__ method returns a formatted string combining title and author.
Step 2: Check what print(str(book)) outputs
It calls the __str__ method, so it prints "Django Basics by Anna" exactly.
Final Answer:
Django Basics by Anna -> Option C
Quick Check:
__str__ output = printed string [OK]
Hint: print(str(object)) shows __str__ return value [OK]
Common Mistakes:
Expecting default object representation instead of __str__ output
Confusing __repr__ with __str__ output
Ignoring f-string formatting in __str__
4. What is wrong with this __str__ method in a Django model?
def __str__(self):
print(self.name)
medium
A. It should return a string, not print it
B. The method name is incorrect
C. It should raise an exception
D. It should be a class method
Solution
Step 1: Check the method's behavior
The method uses print instead of returning a string, so it returns None by default.
Step 2: Understand the expected __str__ behavior
__str__ must return a string to represent the object, not print it.
Final Answer:
It should return a string, not print it -> Option A
Quick Check:
__str__ must return string [OK]
Hint: Always return a string in __str__, never print [OK]
Common Mistakes:
Using print instead of return
Misnaming the method
Making __str__ a class method
5. You have a Django model with fields first_name and last_name. You want the admin and print statements to show the full name. Which __str__ method correctly achieves this and handles missing names gracefully?
hard
A. def __str__(self): return self.first_name + ' ' + self.last_name
B. def __str__(self): return f"{self.first_name or ''} {self.last_name or ''}".strip()
C. def __str__(self): return self.first_name if self.first_name else self.last_name
D. def __str__(self): print(f"{self.first_name} {self.last_name}")
Solution
Step 1: Analyze each option for handling missing names
def __str__(self): return self.first_name + ' ' + self.last_name concatenates directly, which can cause errors if either is None. def __str__(self): return f"{self.first_name or ''} {self.last_name or ''}".strip() uses or '' to avoid None and strips extra spaces. def __str__(self): return self.first_name if self.first_name else self.last_name only returns one name, not full name. def __str__(self): print(f"{self.first_name} {self.last_name}") uses print instead of return.
Step 2: Choose the option that returns full name safely
def __str__(self): return f"{self.first_name or ''} {self.last_name or ''}".strip() returns a full name string, handles missing values, and returns a clean string.
Final Answer:
def __str__(self): return f"{self.first_name or ''} {self.last_name or ''}".strip() -> Option B
Quick Check:
Safe full name string return = def __str__(self): return f"{self.first_name or ''} {self.last_name or ''}".strip() [OK]
Hint: Use or '' and strip() to handle missing fields in __str__ [OK]
Common Mistakes:
Concatenating without checking for None
Using print instead of return
Returning only one field instead of full name
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.