5.8 Rendering Items in the Template
This commit is contained in:
parent
e4cb70719e
commit
fd4dcc2425
@ -337,4 +337,56 @@ So, separate the test code into two:
|
||||
|
||||
self.assertEqual(response.status_code, 302)
|
||||
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
|
||||
```
|
Loading…
x
Reference in New Issue
Block a user