40

I have not figured out how I can present a website with pure HTML code and/or HTML + JavaScript + CSS.

I tried to load an HTML file that just says: Hello World.

I know I can do that with Django too, but later on, I want to display my website with CSS+JavaScript+HTML.

In the views file I run this code:

# Create your views here.
from django.http import HttpResponse
from django.template import Context, loader

def index(request):
    template = loader.get_template("app/index.html")
    return HttpResponse(template.render)

But the only thing the website displays is:

1
  • 2
    In production you'll want to avoid using Django to serve static assets. Also, take a look at docs.djangoproject.com/en/1.8/howto/static-files . If the code you posted is an intermediate step you are taking prior to adding dynamic behavior that's one thing - but if app/index.html is truly a static html page than you should serve it as a static asset in my opinion. Commented Apr 21, 2015 at 14:13

6 Answers 6

38

If your file isn't a django template but a plain html file, this is the easiest way:

from django.shortcuts import render_to_response

def index (request):
    return render_to_response('app/index.html')

UPDATE 10/13/2020:

render_to_response was deprecated in Django 2.0 and removed in 3.0, so the current way of doing this is:

from django.shortcuts import render

def index (request):
    return render(request, 'app/index.html')

Sign up to request clarification or add additional context in comments.

2 Comments

When I do this, the browser just displays the content of the html file which is: <html> <head></head> <body> <h1>hello world</h1> <img src="test.png" alt="some_text"> </body> </html>
Since Django 3.0 render_to_response shortcut was removed. According to stackoverflow.com/a/55911436/7444782 code return render_to_response('app/index.html') could be substituted to return render(None, 'app/index.html').
22

You are not calling the render method there, are you?

Compare:

template.render

template.render()

2 Comments

Ahh yeah right thanks, miss syntax checking... Is there anythin else Is there anythin else I have to pay attention to when I want to use django+html+javascript+css ??
Read on the static app (builtin) and webassets (for js/css minification and cache busting.)
17

If your CSS and JS files are static don't use Django to serve them, or serve them as static files

For your html you could do the same if it is just some fixed file that won't have any dynamic content. You could also use generic views with the TemplateView, just add a line like this to your urls.py:

    url(r'^path/to/url', TemplateView.as_view(template_name='index.html')),

2 Comments

This allowed me to launch the page from django but the text inside {{}} template operator were not appearing.I was using angular js inside the html page this was conflicting with django template {{ operators. I solved the issue by using the recommendation from the post stackoverflow.com/questions/8302928/…
do not forget to include from django.views.generic import TemplateView in urls.py
13

By using HttpResponse you can send data only, if you want to html file then you have to use render or render_to_response by following ways...

from django.shortcuts import render

def index(request):    
    return render(request, 'app/index.html')

or

from django.shortcuts import render_to_response

def index (request):
    return render_to_response('app/index.html')

1 Comment

it will be good if you explain the differences between HttpResponse and render_to_response
4

First, you need to do some settings for templating:

Create "templates" folder in the root directory, where manage.py is located after you created your project. Then go to settings.py , in the TEMPLATES section enter the directory of templates folder. Hard coding is not recommended because if you send your project to your friend, your friend won't be able to run it. Should be like this:

TEMPLATES = [
 {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,"templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

Assuming that you have home.html and about.html have in templates folder:

urls.py

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('about/',views.aboutview),
    path('',views.homeview),
]

views.py

from django.http import HttpResponse
from django.shortcuts import render

def aboutview(request):
  return render(request,"home.html")
def homeview(request):
  return render(request,"about.html")

Comments

2
from django.http import HttpResponse

from django.template import loader

def index(request):

    template=loader.get_template('app/index.html')

    return HttpResponse(template)

2 Comments

Your code differs from OP's code only by one little detail (template.rendervs. template). You may want to explain why this solves OP's problem.
return HttpResponse(template.render()) instead of HttpResponse(template)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.