5.8 Rendering Items in the Template

This commit is contained in:
Jason Zhu 2020-11-09 12:18:41 +11:00
parent e4cb70719e
commit fd4dcc2425

View File

@ -338,3 +338,55 @@ So, separate the test code into two:
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.assertEqual(response['location'], '/') self.assertEqual(response['location'], '/')
``` ```
## 5.8 Rendering Items in the Template
Now, both "Don't save blank items for every request" and "Code smell: POST test is too long?" are finished
Target: "Display multiple item in the table"
TDD step 1: create a UT to check
```python
def test_displays_all_list_items(self):
Item.objects.create(text="itemey 1")
Item.objects.create(text="itemey 2")
response = self.client.get('/')
self.assertIn('itemey 1', response.content.decode())
self.assertIn('itemey 2', response.content.decode())
```
Test will fail as `home.html` we still only allow one item in table
```html
<table id="id_list_table">
<tr><td>1: {{ new_item_text }}</td></tr>
</table>
```
Fix it by allow it to have iterating list. Django template syntax has a tag for iterating through a list `{% for .. in .. %}` + `% endfor %`
```html
<table id="id_list_table">
{% for item in items %}
<tr><td>1: {{ item.text }}</td></tr>
{% endfor %}
</table>
```
Also need pass items to template from home page view:
```python
def home_page(request):
if request.method == 'POST':
Item.objects.create(text=request.POST['item_text'])
return redirect('/')
items = Item.objects.all() # get objects from database (model)
return render(request=request,
template_name='home.html',
context={'items': items}) # pass items into template using render
```