Skip to content

Commit fcdecd9

Browse files
author
Andres Vargas
committed
render function for list of posts
1 parent 116e181 commit fcdecd9

16 files changed

+115
-20
lines changed

app/settings.py

+3
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,6 @@
129129

130130
CSRF_HEADER_NAME="HTTP_X_CSRF_TOKEN"
131131

132+
LIVEWIRE_COMPONENTS_PREFIX="core.views"
133+
134+

app/urls.py

+2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
from django.urls import path, include
33
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
44
from django.views.generic import TemplateView as TV
5+
from core.views import posts
56

67
urlpatterns = [
78
path('admin/', admin.site.urls),
89
path('', include("livewire.urls")),
910
path('counter', TV.as_view(template_name="counter.html"), name="counter"),
11+
path('posts', posts , name='posts'),
1012
path('', TV.as_view(template_name="index.html"), name="index"),
1113
] + staticfiles_urlpatterns()

core/migrations/0001_initial.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 3.0.4 on 2020-03-22 06:03
1+
# Generated by Django 3.0.4 on 2020-03-22 07:12
22

33
from django.db import migrations, models
44

@@ -16,7 +16,7 @@ class Migration(migrations.Migration):
1616
fields=[
1717
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
1818
('title', models.CharField(max_length=100)),
19-
('context', models.TextField()),
19+
('content', models.TextField()),
2020
('created_at', models.DateTimeField(auto_now_add=True)),
2121
('updated_at', models.DateTimeField(auto_now=True)),
2222
],

core/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
class Post(models.Model):
55
title = models.CharField(max_length=100)
6-
context = models.TextField()
6+
content = models.TextField()
77

88
created_at = models.DateTimeField(auto_now_add=True)
99
updated_at = models.DateTimeField(auto_now=True)

core/templates/base.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@
1212
<section class="section">
1313
<div class="container">
1414
<h1 class="title">
15-
Hello livewire
15+
<a href="{% url 'index' %}"> Hello livewire</a>
1616
</h1>
1717
<p class="subtitle">
1818
My first website with <strong>django-livewire</strong>!
1919
</p>
2020

21+
2122
{% block content %}
2223
{% endblock %}
2324
</div>

core/templates/counter.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
{% load livewire_tags %}
33
{% block content %}
44

5-
{% livewire "counter" %}
5+
{% livewire "counter" %}
66

77
{% endblock content %}

core/templates/delete_post.livewire.html

Whitespace-only changes.

core/templates/index.html

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
<li>
99
<a href=" {% url 'counter' %}" >counter</a>
1010
</li>
11+
<li>
12+
<a href=" {% url 'posts' %}" >posts</a>
13+
</li>
1114
</ul>
1215
</div>
1316
{% endblock content %}

core/templates/posts.html

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{% extends "base.html" %}
2+
{% load livewire_tags %}
3+
{% block content %}
4+
5+
{% livewire "posts" posts=posts %}
6+
7+
{% endblock content %}

core/templates/posts.livewire.html

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<div>
2+
3+
<h1 class="title">Posts</h1>
4+
5+
<table class="table">
6+
<tr>
7+
<th>Title</th>
8+
<th> Content </th>
9+
</tr>
10+
11+
12+
{% for post in posts %}
13+
<tr>
14+
<td> {{post.title}}</td>
15+
<td>{{post.content}}</td>
16+
</tr>
17+
18+
{% endfor %}
19+
20+
21+
</table>
22+
</div>

core/views.py

+21-2
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,36 @@
11
from django.shortcuts import render
22
from livewire.views import LivewireComponent
33

4+
from core.models import Post
5+
6+
7+
def posts(request):
8+
context={
9+
'posts': list(Post.objects.all().values("id", "title", "content"))
10+
}
11+
return render(request, "posts.html", context)
12+
13+
14+
15+
class PostsLivewire(LivewireComponent):
16+
17+
def mount(self, **kwargs):
18+
posts = kwargs.get("posts")
19+
return {
20+
'posts':posts
21+
}
22+
23+
424

525
class CounterLivewire(LivewireComponent):
6-
component_name = "counter"
726
count = 2
827
def decrement(self, *args):
928
self.count -=1
1029

1130
def increment(self, *args):
1231
self.count +=1
1332

14-
def get_context(self):
33+
def mount(self, **kwargs):
1534
return {
1635
'count': self.count
1736
}

livewire/templates/livewire_scripts.html

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
<script src="{{STATIC_URL}}dist/livewire.js?id=c6f7d3682bc8d847a034" data-turbolinks-eval="false"></script>
22
<script data-turbolinks-eval="false">
33
window.livewire = new Livewire();
4-
window.livewire_app_url = '';
4+
window.livewire_app_url = "";
5+
{% comment %}
6+
TODO: livewire_app_url prefix by settings
7+
{% endcomment %}
58
window.livewire_token = '{{ csrf_token }}';
69

710
document.addEventListener("DOMContentLoaded", function() {
+2-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django import template
22
from livewire.views import LivewireComponent
3+
from livewire.utils import instance_class
34
register = template.Library()
45

56
@register.inclusion_tag("livewire_scripts.html", takes_context=True)
@@ -8,8 +9,5 @@ def livewire_scripts(context):
89

910
@register.simple_tag
1011
def livewire(component,**kwargs):
11-
# TODO: register Components by livewire.register(ComponentLivewire)
12-
from core.views import CounterLivewire
13-
livewire_component = CounterLivewire()
14-
print(livewire_component.get_context())
12+
livewire_component = instance_class(component, **kwargs)
1513
return livewire_component.render_initial()

livewire/urls.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
from .views import livewire_message
44

55
urlpatterns = [
6-
path('livewire/message/<component_name>', livewire_message),
6+
path('livewire/message/<component_name>', livewire_message, name='livewire_app_url'),
77
]
88

livewire/utils.py

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from django.shortcuts import render
2+
from django.template.loader import render_to_string
3+
from django.utils.encoding import smart_str
4+
from django.utils.safestring import mark_safe
5+
from django.http import JsonResponse
6+
from django.conf import settings
7+
import random
8+
import string
9+
import json
10+
import importlib
11+
import htmlement
12+
import xml.etree.ElementTree as ET
13+
14+
15+
def get_id():
16+
return ''.join(random.choice(string.ascii_lowercase) for i in range(20))
17+
18+
def get_component_name(name):
19+
name = name.replace("_", " ")
20+
return name.title().replace(" ","")
21+
22+
def instance_class(component_name, **kwargs):
23+
path = getattr(settings,"LIVEWIRE_COMPONENTS_PREFIX")
24+
if not path:
25+
assert False, "LIVEWIRE_COMPONENTS_PREFIX missing"
26+
module = importlib.import_module(path)
27+
class_name = get_component_name(component_name)
28+
class_livewire = getattr(module, '{}Livewire'.format(class_name))
29+
inst = class_livewire(**kwargs)
30+
return inst
31+
32+

livewire/views.py

+12-7
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,41 @@
33
from django.utils.encoding import smart_str
44
from django.utils.safestring import mark_safe
55
from django.http import JsonResponse
6+
from django.conf import settings
67
import random
78
import string
89
import json
910
import importlib
1011
import htmlement
1112
import xml.etree.ElementTree as ET
13+
from .utils import get_id, get_component_name, instance_class
1214

1315
def livewire_message(request, component_name):
14-
15-
# TODO: change for load the component dynamic
16-
from core.views import CounterLivewire
17-
inst = CounterLivewire()
16+
inst = instance_class(component_name)
1817
if request.method == "POST":
1918
body = json.loads(request.body)
2019
inst.parser_payload(body)
2120
return JsonResponse(inst.render(), safe=False)
2221

23-
def get_id():
24-
return ''.join(random.choice(string.ascii_lowercase) for i in range(20))
2522

2623
class LivewireComponent(object):
2724
id = None
2825

26+
def __init__(self, **kwargs):
27+
self.kwargs = kwargs
28+
2929
def get_component_name(self):
30-
return self.component_name.lower()
30+
name = self.__class__.__name__.lower()
31+
return name.replace("livewire","")
3132

3233
def get_dom(self):
3334
context = self.get_context()
3435
return self._render_component(context)
3536

37+
def get_context(self):
38+
kwargs = self.kwargs
39+
return self.mount(**kwargs)
40+
3641
def get_response(self):
3742
dom = self.get_dom()
3843
return {

0 commit comments

Comments
 (0)