Dave
Dave

Reputation: 393

Django returns 'TemplateDoesNotExist' when using Crispy Forms

Using Crispy Forms with Django, I can only get a TemplateDoesNotExist error when using any feature of Crispy Forms.

As I'm new to Crispy Forms (which seems to be universally recommended for quickly making forms look better), I have followed the instructions at https://django-crispy-forms.readthedocs.io/en/latest/install.html and as far as I know, the installation is correct (installed using pip and changes in settings.py). I am running this in a virtual environment (the .venv folder referred to below) on a Windows machine.

I have even created a new project specifically to look at this, with absolutely minimal content, and the same problem persists. The project is called 'stuff' and the single app in it 'other'.

settings.py

...

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'crispy_forms',
    'other',
    'bootstrap4'
]

CRISPY_TEMPLATE_PACK = 'bootstrap4'

...

models.py

from django.db import models

class Mine(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

forms.py

from django import forms
from .models import Mine

class MineForm(forms.ModelForm):
    class Meta:
        model = Mine
        fields = ('name','email')

views.py

from django.shortcuts import render
from .forms import *

def idx(request):
    tform = MineForm()

    return render(request,'test.html',{'aform': tform})

test.html

{% load bootstrap4 %}
{% load crispy_forms_tags %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>TestThing</title>
</head>
<body>
    <form action="/">
        {% csrf_token %}
        {{ aform|crispy }}
    </form>
</body>
</html>

results of pip freeze

asgiref==3.6.0
beautifulsoup4==4.11.2
Django==4.1.7
django-bootstrap4==22.3
django-crispy-forms==2.0
soupsieve==2.4
sqlparse==0.4.3
tzdata==2022.7

error reported on debug page

TemplateDoesNotExist at /
bootstrap4/uni_form.html

Template-loader postmortem

Template-loader postmortem
Django tried loading these templates, in this order:

Using engine django:

django.template.loaders.app_directories.Loader: C:\ProjectDir\.venv\lib\site-packages\django\contrib\admin\templates\bootstrap4\uni_form.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\ProjectDir\.venv\lib\site-packages\django\contrib\auth\templates\bootstrap4\uni_form.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\ProjectDir\other\templates\bootstrap4\uni_form.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\ProjectDir\.venv\lib\site-packages\bootstrap4\templates\bootstrap4\uni_form.html (Source does not exist)

It looks to me like Crispy can't see the templates which should have been installed. Or perhaps there's something else I'm supposed to download or create?

I wanted to quickly tidy a form up in my Django project before moving on to more pressing matters, and hours later I still can't get Crispy Forms to function at all (it would have been quicker to sort this in other ways). It's clear I'm missing something, but what?

Other Weird and Wonderful things I've tried

Not all of these might be logical, but hey!

Upvotes: 29

Views: 33554

Answers (6)

Sudip Acharya
Sudip Acharya

Reputation: 11

Install this plugin using pip:

$ pip install crispy-bootstrap4

Usage You will need to update your project's settings file to add crispy_forms and crispy_bootstrap4 to your projects INSTALLED_APPS. Also set bootstrap4 as and allowed template pack and as the default template pack for your project:

INSTALLED_APPS = (
    ...
    "crispy_forms",
    "crispy_bootstrap4",
    ...
)

CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap4"

CRISPY_TEMPLATE_PACK = "bootstrap4"

Upvotes: 1

Brian Muoki
Brian Muoki

Reputation: 1

The easiest solution is to pip install django_crispy_forms==1.2 This will install the first version of crispy forms

Upvotes: -1

Akshay Babu
Akshay Babu

Reputation: 51

  1. Run this command:

    pip install django-crispy-forms
    
  2. Go to settings.py and add this in the installed apps (don't forget the comma):

    "crispy_forms",
    "crispy_bootstrap4"
    
  3. Add this after the installed apps (here there's no need for a comma):

    CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap4"
    CRISPY_TEMPLATE_PACK = 'bootstrap4'
    
  4. Go to the html page where you want to add the crispy form and add this in the head section:

    {% load crispy_forms_tags %}
    
  5. Finally add this to the body section:

    {{form|crispy_field}} 
    

Upvotes: 5

sourav kumar
sourav kumar

Reputation: 1

I faced same issue and got solution. This is because you are using django-crispy-forms==2.0 and your project is not compatible with this version. also this django-crispy-forms==2.0 not support bootstrap4.

SOLUTION: so install packages with below mention version: (make sure python version > 3.7)

  • pip3 install Django==4.1.6
  • pip3 install django-allauth==0.52.0
  • pip3 install django-crispy-forms==1.14.0 # version <=1.70
  • pip3 install django-embed-video

Upvotes: 0

David Smith
David Smith

Reputation: 1306

As of django-crispy-forms 2.0 the template packs are now in separate packages.

You will need to pip install crispy-bootstrap4 and add crispy_bootstrap4 to your list of INSTALLED_APPS.

Upvotes: 92

hybridmixture
hybridmixture

Reputation: 161

if you need to use bootstrap4

  1. pip install django-crispy-forms
  2. pip install crispy-bootstrap4

inside settings.py in the main app add INSTALLED_APPS = [ ... 'crispy_forms', 'crispy_bootstrap4', ... ] and CRISPY_TEMPLATE_PACK = 'bootstrap4'

inside your_html.html file add {% load crispy_forms_tags %} and you can use cripy_forms as you like

Upvotes: 16

Related Questions