Django - Recursion Error with static main.css - python

Running into a max recursion error when hitting my static main.css file in django. Need help identifying the issue and how to correct it.
Had no issues when my login/sign up pages were within my single dbManagementApp. After adding those to a new app (accounts) then adding the templates into a specific folder for each app, I received the below error message.
Debugger
In template ###, error at line 7
maximum recursion depth exceeded while calling a Python object
1 <!DOCTYPE html>
2 <html lang="en" dir="ltr">
3 <head>
4 <meta charset="utf-8">
5 <title>HOME</title>
6 {% load static %} <!-- load the static folder for css-->
7 <link rel="stylesheet" href="{% static 'main.css' %}">
Traceback
File "C:\Users\lukep\anaconda3\envs\djangoenv\lib\site-packages\django\template\base.py", line 766, in __init__
self.literal = float(var)
ValueError: could not convert string to float: "'main.css'"
My main urls.py:
from django.contrib import admin
from django.urls import path, include
from dbManagementApp import dbmviews
from accounts import accviews
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('dbManagementApp.dbmurls')),
path('accounts/', include('accounts.accurls'))
]
dbManagementApp/dbmurls.py
from django.urls import path
from . import dbmviews
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('', dbmviews.home, name='home'),
path('aboutus/', dbmviews.aboutUs, name='aboutUs'),
path('pricing/', dbmviews.pricing, name='pricing'),
path('contact/', dbmviews.contact, name='contact'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
dbManagementApp/dbmviews.py
from django.shortcuts import render, redirect
from django.views import View
from .models import Doc
from .forms import DocumentForm
from django.contrib import messages
from django.http import HttpResponse
from django.http import JsonResponse
# Create your views here.
def home(request):
return render(request, 'dbmapp/index.html')
templates/dbmapp/index.html
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>HOME</title>
{% load static %} <!-- load the static folder for css-->
<link rel="stylesheet" href="{% static 'main.css' %}">
accounts/accurls.py
from django.urls import path
from . import accviews
urlpatterns = [
path('register/', accviews.register, name='register'),
path('login/', accviews.login, name='login')
]
accounts/accviews.py
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
def register(request):
if request.method == "POST":
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
return redirect('login')
else:
form = UserCreationForm()
return render(request, 'registration/register.html', {'form':form})
def login(request):
return render(request, 'registration/login.html')

I'm not fully understand your problem, but I'd change 3 things
{% load static %} should be at the top of the html file
Move path('', include('dbManagementApp.dbmurls')), first (before admin)
Remove dir attribute in html.
Just a question, are you using {% extends 'whatever.html' %}?, it cause error from duplicating tags.

Related

Django images upload fails

I am using django to upload a image to the database (POST request) and show the same in the site.
but for some reason my image is not uploading
models.py -
from django.db import models
class image_classification(models.Model):
pic=models.ImageField(upload_to='images')
views.py
from django.shortcuts import render
from .models import image_classification
from django.http import HttpResponse, HttpResponseRedirect
# def home(request):
# print('here you go ')
# images=image_classification.objects.all()
# url=images[len(images)-1].pic.url
# return render(request,'home.html',{'print':'everything is ok','image':url})
def home(request):
print('here you go ')
images=[]
images=image_classification.objects.all()
if len(images) > 0:
url=images[len(images)-1].pic.url
else:
url="place holder image url"
return render(request,'home.html',{'print':'everything is ok','image':url})
#handles uploaded images
def uploadImage(request):
print('image handling ')
img= request.FILES['image']
image=image_classification(pic=img)
image.save()
return HttpResponseRedirect('/')
url of the app
from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('',views.home,name='home')
]
urlpatterns+= static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns+= static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
url.py for project (incase you need this)
from django.contrib import admin
from django.urls import path, include
from ImageClassifier import views
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path("admin/", admin.site.urls),
path('', include('ImageClassifier.urls')),
]
lastly settings.py (not sure if this is needed)
MEDIA_ROOT= os.path.join(BASE_DIR,'ImageClassifier/media/')
MEDIA_URL= '/media/'
STATIC_URL = "/static/"
STATIC_ROOT= os.path.join(BASE_DIR, 'static')
and this is the error i am getting on the webpage while running
Make sure that you have the following code in project's urls.py:
from django.contrib import admin
from django.urls import path, include
from ImageClassifier import views
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path("admin/", admin.site.urls),
path('', include('ImageClassifier.urls')),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
I think the reason your image is not uploading is that you are not checking whether the request method is POST or not. Try below approach and see if it works.
views.py to save to database
from django.shortcuts import render, redirect
def image(request):
if request.method == "POST":
image = request.FILES.get("image")
pic = Image.objects.create(pic=image)
pic.save()
return redirect('/')
return render(request, "image.html", {})
template.html
<!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>Document</title>
</head>
<body>
<form action=/image/ method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="image">
<input type="submit" value="upload file">
</form>
</body>
</html>
Url of project
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path("admin/", admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Url of app
from django.urls import path
from . import views
urlpatterns = [
path("image/", views.image, name="image"),
]
Lastly, settings.py
BASE_DIR = Path(__file__).resolve().parent.parent
MEDIA_ROOT = BASE_DIR / "media"
MEDIA_URL = "/media/"
P.S: Whenever you want to name a class, you should always use PascalCase not camelCase for the naming convention. You can read on python naming convention here. Hence you model will look something like this:
class ImageClassification(models.Model):
pic=models.ImageField(upload_to='images')

Django - issue with loading css

I've recently started learning Django and I've been having a lot of issues with implementing css into my code. I've found a lot of people with the same issue as me but I am still unable to find an answer.
Currently when I run open the website it give me this https://imgur.com/a/0N23s7b
And I'm not sure if this is because of the settings, the actual css or something in the html.
My html boilerplate
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>homepage</title>
<link rel="stylesheet" type="test/css" href="{% static'css/home.css' %}"/>
</head>
settings.py
DEBUG = True
STATIC_ROOT = ''
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']
STATIC_URL = '/static/'
views.py
from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
from leatherbiscuit.views import index
urlpatterns = [
path('admin/', admin.site.urls),
path('', index),
]
if settings.DEBUG:
urlpatterns+=static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
urls.py
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import TemplateView
def index(request):
return render(request, 'index.html')
def home_view(request):
return HttpResponse(request, 'index.html')
You need to add a space between the name of the template tag and its parameters, so it should be:
&downarrow; a space between static and 'css/home.css'
{% static 'css/home.css' %}
The parser of the Django template engine has some peculiarities. For example, a tag should not be spanned over multiple lines, and like in Python's method calls one should first list the positional parameters and then the named parameters.

I can access fatimatestpro.pythonanywhere.com but not fatimatestpro.pythonanywhere.com/help/

I am working on PythonAnywhere and made my first project. I am trying to access many views (HTML pages) from my views.py. Here is my project tree:
emailpro
--emailpro
----url.py
--emailapp
----urls.py
----views.py
--templates
----emailapp
------index.html
------help.html
Code inside my emailpro>emailpro>urls.py is
from django.conf.urls import url, include
from django.contrib import admin
#from emailapp import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
#url(r'^$', views.index, name='index'),
url('', include('emailapp.urls')),
]
Code inside my emailpro>emailapp>urls.py is:
from django.conf.urls import url
from emailapp import views
urlpatterns=[
url('', views.index, name='index'),
url(r'^help/$', views.help, name='help'),
]
Code inside my emailpro>emailapp>views.py is
from django.shortcuts import render
#from django.http import HttpResponse
# Create your views here.
def index(request):
my_dict={'insert_me': "Hi I am index coming from views.py"}
return render(request, 'emailapp/index.html', context=my_dict)
def help(request):
help_dict={'help_insert': "HELP PAGE"}
return render(request, 'emailapp/help.html', context=help_dict)
My emailpro>templates>emailapp>index.html is
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Index</title>
</head>
<body>
<h1>Index page</h1>
{{ insert_me }}
</body>
</html>
Code inside my emailpro>templates>emailapp>help.html is
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title> Help </title>
</head>
<body>
<h1>This is my Help HTML</h1>
{{ help_insert }}
</body>
</html>
Now when I run my site and access http://fatimatestpro.pythonanywhere.com/, it shows me my index.html page which means it is going inside my emailpro>emailapp>urls.py to get its view from views.py but when I try to access http://fatimatestpro.pythonanywhere.com/help/, it shows the same page as index.html.
Please help me to send it to different view.
Thanks in advance
your index url is matching before it reaches the help url.
try:
urlpatterns=[
url(r'^help/$', views.help, name='help'),
url('/', views.index, name='index'),
]

Passing data between veiws.py and template.html in django

I am new in Django. I want to write a very simple code to create a string in views.py and shows in an html file in templates.:
views.py
from django.shortcuts import render
from django.http import JsonResponse
def index(request):
F = 100
response = str(F + 10)
response1 = {"Main": response}
template_name = "homepage.html"
return render(request, template_name, response1)
urls.py
urlpatterns = [
path('', views.index, name='homepage.html'),
path('admin/', admin.site.urls)]
homepage.html
<html>
<head>
<h1>User Information</h1>
</head>
<h2>Answer: {{response1}}</h2>
</html>
What I get on webpage is the headers without {{response1}}
<html>
<head>
<h1>User Information</h1>
</head>
<h2>Answer: {{Main}}</h2>
</html>
Use this

Django - No redirect on form submission

I'm at the end of my rope trying to figure out why a simple form redirect is not working. I'm submitting a form with one text field via POST request that gets combined with some data from a function in the same views.py file, which is then saved to the model on the database. For some reason, with the redirect schemes that I've set up on submission of the form, I get either a second copy of the form.
feedbackapp/views.py
from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect
from django.urls import reverse
from .forms import FeedbackForm
from .models import Feedback
def record_feedback(request):
if request.method == 'POST':
form = FeedbackForm(request.POST)
if form.is_valid():
feedback = Feedback()
feedback.submitter_ip = get_client_ip(request)
feedback.feedback_text = form.cleaned_data['feedback']
feedback.save()
return HttpResponseRedirect(reverse('feedbackapp:thanks'))
elif request.method == 'GET':
form = FeedbackForm()
return render(request, 'feedbackapp/feedback_form.html', {'form': form})
def thanks(request):
return render(template_name='feedbackapp/thanks.html',request=request)
# https://stackoverflow.com/questions/4581789/how-do-i-get-user-ip-address-in-django
def get_client_ip(request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[-1] # needs to be the last element in array for Heroku
else:
ip = request.META.get('REMOTE_ADDR')
return ip
feedbackapp/forms.py
from django import forms
class FeedbackForm(forms.Form):
feedback = forms.CharField(label='Feedback', max_length=5000)
feedbackapp/templates/feedbackapp/feedback_form.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Anonymous Feedback</title>
</head>
<body>
<form action="/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit"/>
</form>
<p><i>Note: IP addresses are collected with each submission.</i></p>
</body>
</html>
feedbackapp/templates/feedbackapp/thanks.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Thanks!</title>
</head>
<body>
<p>Thanks for your feedback.</p>
</body>
</html>
feedbackapp/urls.py
from django.conf.urls import url
from .views import record_feedback, thanks
urlpatterns = [
url('', record_feedback, name='feedback'),
url('thanks/', thanks, name='thanks'),
]
anonfeed/urls.py
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url('', include('feedbackapp.urls'), namespace='feedbackapp'),
]
It is almost as if the thanks view is not associating with the url and the template.
Your empty regex overrides the one for thanks. Change the following line:
url('', record_feedback, name='feedback'),
to
url('^$', record_feedback, name='feedback'),

Categories