This sounds a bit like combining django-sniplates with django-amn, and
going a bit further...

Fragments of templates, list of JS/CSS dependencies, and a way to collect
it all together and ensure your page has everything  you need...

Sounds interesting to me... I'd be happy to collaborate on it with you...
once we see where it goes, and compare it with the existing implementation,
people will have more food for thought :)

--
Curtis


On 31 May 2015 at 02:52, Emil Stenström <e...@kth.se> wrote:

> Hi,
>
> This is the first feature proposal as part of my general drive for getting
> Django to work better for javascript heavy sites.
>
> Template Components
> -------------------
>
> React.js popularized the notion that in front-end development, code
> organization should be based on interface components, not split up into
> HTML, Javascript and CSS. Here's the original presentation and the
> rationale behind organizing around components:
> https://www.youtube.com/watch?v=x7cQ3mrcKaY&t=2m7s
>
> In Django, adding a Javascript calendar to you site requires changes to
> four different locations in your project:
>
> - /app/templatetags/calendar_tags.py <- A custom inclusion template tag
> - /app/templates/calendar.html <- Some HTML in the template dir
> - /static/css/style.css <- Add some CSS to style.css
> - /static/js/script.js <- Add some JS to scipt.js
>
> There is no connection within Django between HTML and the CSS + JS. Django
> does not help you, or even suggest a structure for you, like it does with
> all Python code.
>
> On the other hand, we have Form Assets:
> https://docs.djangoproject.com/en/1.8/topics/forms/media/
>
> Example:
>
> from django import forms
> class CalendarWidget(forms.TextInput):
>     class Media:
>         css = {'all': ('calendar.css',)}
>         js = ('calendar.js',)
>
>  w = CalendarWidget()
>>>> print(w.media)
>>>>
>>> <link href="calendar.css" media="all" rel="stylesheet" />
> <script src="script.js"></script>
>
> ... which define a kind of component, but one that is tied to a form
> field. My suggestion is a new package: django.template.component, that
> builds on the Media class from Form Assets, and allows you to define your
> components like this:
>
> from django.template import component
> class Calendar(component.Component):
>     def context(self, date):
>         return {"date": date}
>     class Media:
>         template = "app/components/calendar/calendar.html"
>         css = {'all': ('app/components/calendar/calendar.css',)}
>         js = ('app/components/calendar/calendar.js',)
>
> component.register(name="calendar", component=Calendar)
>
> ... and later in your template:
>
> {% load components %}
> {% block extra_media %}{% component_dependencies %}{% endblock %}
> {% block main %}
>     {% component "calendar" date=custom_date %}
> {% endblock %}
>
> ---
>
> Advantages:
> - You to keep the python, html, css, and javascript in one location, and
> explicitly define the dependencies between them.
> - All <link> and <script> tags would be handled by the
> component_dependencies template tag (the Media class behind the scences).
> - No need for inclusion template tags
> - Better customization of the admin, where you could simply register your
> own components to replace existing ones
> - Reuse of components from the admin outside of it. Just use the name from
> the admin and send the correct parameters. If you want to change the CSS,
> just import the class and override the properties you want to change.
>
> ---
>
> I think this would be a great addition to Django, and some of the work is
> already done in the Media class that form assets is using. This would of
> course be optional, but I think lots of people would see the benefits of
> using this structure instead of their existing one.
>
> Would anyone we willing to work with me on this? Do you think it makes
> sense to put this in Django? I don't see any need for this code to change
> often, and the API is fairly similar to an existing one.
>
> Thoughts? Ideas?
>
> Regards,
>
> Emil Stenström
> Twitter: @EmilStenstrom
>
> --
> You received this message because you are subscribed to the Google Groups
> "Django developers  (Contributions to Django itself)" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to django-developers+unsubscr...@googlegroups.com.
> To post to this group, send email to django-developers@googlegroups.com.
> Visit this group at http://groups.google.com/group/django-developers.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-developers/5569EAC5.1020804%40kth.se
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-developers+unsubscr...@googlegroups.com.
To post to this group, send email to django-developers@googlegroups.com.
Visit this group at http://groups.google.com/group/django-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/CAG_XiSBOEEJQvy6TrBLneFJuayAmkHBHHUbxAyXbxHq%3DPbNFdg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to