Dynamically choose which base template to extend in django - django

I have content that is going to be the exact same between the mobile and web site. The only thing i want to change is the base template. One base template for the mobile HTML, and one for the website HTML.
One solution is to wrap the render_to_response and determine which HTML to render, but I'd still have two files.
Is there a way I can dynamically tell the template which page to extend?

Sure, you can just use a template variable as the template name. Try it out! :-)

Related

Combining multiple Django Views/Templates

I am working on a website. On the Homepage, I want to show the posts in the center and show famous tags on the right side of the page. Now, posts and tags are two different apps and their views/tempaltes are calculated/generated in two separate functions.
How can I show what I want on my Homepage keeping my mind that its two different views being called. As far as I understand, I can only call a single view to show my homepage.
This must be possible but I am unable to understand this. Any help will be much appreciated.
I think you need to create a custom template tag that in this case called: Inclusion tags
You can look into writing a custom template tag for the tags. That way the tag logic can stay in the right application.
It depends how these different apps render the templates. If they just render the template without extending from a base template you could simply use AJAX to load all the content into your homepage.
If not, then there is no other way than writing a custom solution for this. This could be an extension to your views, a custom template tag as already mentioned or something else according to what exactly you need.

Changing django extended template to have all provided templates according to my design

To utilize django's own provided templates like forgot password, change password and such templates and views funcionality, I made my own templates for login e.t.c. But after some time I found that there are many views and templates already present that one can utilize just by providing right URL but only problem is that these templates are extending django's own template. So I want to know that is there a way to only set extended template of my own choice that is my site's main template so that I just give the URL of forgot password or change password e.t.c. related pages and django render the template by extending my main template instead of django's own template. I am not sure if admin panel is extending the same template that other pages are.
Please tell how can I do so and also please tell if doing so can have any problem.
More detail:
I know inheritance and extending with our template file but how can I set my own template in such way that they automatically inherit mine.
For example, for forgotpassword, I had to make a template file and need to paste form elements and top of it I write {%extends main.html%} but I don't want that, I know that default forgot password template is being inherited from some default django template I want to set it some so that it always inherit from my template in that case.
Short answer: You have to write your own templates.
Longer answer:
Django does include some templates, but these are all intended solely for the admin application. The auth views default to using 'registration/some_template.html', and those templates all live in the admin app ( see https://github.com/django/django/tree/master/django/contrib/admin/templates/registration). The auth views all support a template keyword argument that you can supply in your URLConf, so that you can specify which of your own templates to use.
Think of the admin templates as a reference that you can use when writing your own templates, but not as something you're meant to use directly.
Try to get your head around template inheritance. I think you can achieve what you want using template inheritance. This is a good post introducing the topic.

Dynamic templates in Django

I'm about to make a dynamic website in Django so that user can change the template the website is based upon....for new users, they'll have to choose a template they like from a menu, after which this is stored in a cookie for future reference. I however don't know how to do this....any ideas.
Templates are text files in a directory on your server.
The menu is a list of directories.
The specific template to be loaded is named in your render_to_response calls in each view function.
It's wonderfully quite simple and elegant.
You never need to do a template "swap". You can simply have all the templates you ever want in a template search path. All can be available to all users at all times. You just provide directory_name/template_name. All handled for you.
Don't mess with explicit cookies. Django already does this for you. See chapter 12 of the Django Book.
Use the Profiles extension and put the selected template directory name in the user's profile.
When user selects a template, store the template name/ some sort of alias in the cookie. When the user loads the page again, in the view function, check for template identifier in the cookie. If the identifier is present, retrieve the actual template path and pass it to the render_to_response function.

How can I pass a standard, static variable from all views in Django?

I'm working on a blog application, and I want to have a sidebar that includes a list of all the months the blog has been in existence, to provide links to archives pages. Moreover, I'd like to make this automatically update when the month changes, rather than hardcoding it in the template. Of course, as far as I can tell, this means that I'll have to calculate the list of months in every view, and pass it into every template from every view.
I'd like to avoid this, if possible. Is there a way to calculate the list once and automatically apply it to every template, without having to explicitly pass it into the template from every view?
There are a few possible solutions to your problem.
If you really want to have this on every page on your site a context processor is probably your best choice. Context processors are basic way to inject data into all template contexts. Be aware however that the context processor will be called on every request.
An alternative solution would be to create a custom template tag and use it on a shared base template for all of the pages you wish to have your sidebar. Template tags are a bit more complex to create but they are more flexible.
With either solution you should also look at Django's cache framework. The cache framework makes it pretty easy to temporarily store your calculated values for a while to save some work on each request.
You want a template context processor
Django - having middleware communicate with views/templates
http://docs.djangoproject.com/en/dev/ref/templates/api/?from=olddocs#id1
Django's template inheritance should cover this. You could create a base template that handles your sidebar functionality. Your other views extend this template.
Template Inheritance:
http://www.djangobook.com/en/1.0/chapter04/#s-template-inheritance
A combination of custom template tags as mentioned previously and template fragment caching should do the trick.

How do I use the change_form.html template in django?

I have my models and I would like to make use of the Django change_form template to edit my data.
Currently I have created my own template that works fine but lacks some of the basic stuff that change_form template might have, like fields validation.
Please give examples showing how should I call the template from my view, and what object variables need to be sent to the template.
Pointers to external projects/links that make use of this templates will be highly appreciated.
The only change_form.html template I know of is in Django's admin application. You don't use the template directly, you'll want to set up the admin application for editing your data. In order to do that, follow the steps in the documentation. If you have problems, post those problems as separate, specific questions.