Q: django-simple-menu - menu doesn't load - python

my django-simple-menu doesn't work. My code very closely resembles the example from the doku https://django-simple-menu.readthedocs.io/en/latest/usage.html#usage-example.
The page loads without the menu links and I get no errors messages. Would be grateful for any ideas on how to solve this.
Django: 3.0.1
Python: 3.7.5
nav.html
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark">
<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
{% for item in menu %}
<li class="nav-item active">
<a class="nav-link" href="{{ item.url }}">{{ item.title }} <span class="sr-only">(current)</span></a>
</li>
{% endfor %}
</ul>
</div>
</nav>
base.html
{% load menu %}
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
...
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static '/css/base.css' %}">
</head>
<body>
{% if user.is_authenticated %}
<div class="d-flex bg-dark header " >
<div class="p-2 flex-grow-1 bg-dark "> </div>
<div class="p-2 bg-dark ">User: {{ user.username }} </div>
<div class="p-2 bg-dark">Logout</div>
</div>
{% generate_menu %}
{% with menu=menus.main %}{% include 'nav.html' %}{% endwith %}
{% else %}
....
{% endif %}
<main>
...
</main>
</body>
</html>
setttings.py
"""
Django settings for nsap project.
Generated by 'django-admin startproject' using Django 3.0.1.
For more information on this file, see
https://docs.djangoproject.com/en/3.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.0/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '+hari9jxke*m!4os*6gc!4ygk_hr5es-qdx)x=qza7)7m&x&%='
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'userManagement.apps.UsermanagementConfig',
'doppik.apps.DoppikConfig',
'base.apps.BaseConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'menu',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
BASE_DIR + '/nsap/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',
],
},
},
]
WSGI_APPLICATION = 'wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# USER Model
#AUTH_USER_MODEL = 'core.User'
# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Europe/Berlin'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/
PROJECT_NAME = 'nsap'
STATIC_ROOT = os.path.join(BASE_DIR, PROJECT_NAME, 'staticfiles')
STATIC_URL = os.path.join(BASE_DIR, PROJECT_NAME, 'static/')
#MEDIA_URL = '/media/'
#MEDIA_ROOT = os.path.abspath(os.path.join(BASE_DIR, '..','..', 'media'))
# Loging
LOGIN_REDIRECT_URL = '/'
menus.py
from menu import Menu, MenuItem
from django.urls import reverse
Menu.add_item("main", MenuItem("Booking",
reverse("doppik.views.booking"),
weight=10,
icon="tools"))
Menu.add_item("main", MenuItem("ShowAccount",
reverse("doppik.views.show_accounts"),
weight=10,
icon="tools"))
Menu.add_item("main", MenuItem("Login",
reverse('django.contrib.auth.views.login'),
check=lambda request: not request.user.is_authenticated()))
Menu.add_item("main", MenuItem("Logout",
reverse('django.contrib.auth.views.logout'),
check=lambda request: request.user.is_authenticated()))
Edit:
I think the problem is that menus.py is not running and no MenuItems are added to Menu.
I have added the command print("foo") to the menus.py file. The output does not display in the terminal.

Are you running the pip installed build, or have you tried this fork that has Django 2.2 support? https://github.com/skunkie/django-simple-menu/ I imagine the original build may have some compatibility issues.

Related

Django messages not displaying message

I'm trying to use django messages to notify user if form was submitted successfully or not. But nothing pops up when I submit the form no matter what. I've gone through the views.py code and template and I don't seem to anything wrong. I've even tried changing the default messages backend storage to session yet nothing.
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
views.py:
from django.shortcuts import render, HttpResponse, HttpResponseRedirect, redirect
from django.contrib import messages
from .forms import MyUserCreationForm
import bcrypt
def register(request):
if request.method == "POST":
# Populate form using submitted data
form = MyUserCreationForm(request.POST)
if form.is_valid():
# Clone form model
user = form.save(commit=False)
password = user.password
# Validate password length
if len(password) > 25:
messages.error(
request, "PASSWORD MUST BE LESS THAN OR EQUAL TO 25 CHARACTER LENGTH")
# Hash user password
bytes = password.encode('utf-8')
salt = bcrypt.gensalt()
hash = bcrypt.hashpw(bytes, salt)
# Save modified form to database
user.password = hash
user.save()
messages.success(request, "ACCOUNT CREATED SUCCESSFULLY!")
messages.add_message(request, messages.INFO,
'Thanks for reaching out! We will be in contact soon!',
extra_tags='ex-tag')
return redirect('register')
# Create empty form
form = MyUserCreationForm()
return render(request, 'register.html', {'form': form})
templates/register.html:
{% extends "layout.html" %}
{% block title %}
Testing Registration
{% endblock %}
{% load static %}
{% load crispy_forms_tags %}
{% block main %}
<div class="container p-2 px-4 p-md-3">
<div class="container-fluid p-0" style="height: 40px;"></div>
</div>
<div class="container">
<div class="mx-auto ">
<form method="POST" action="/register/">
{% csrf_token %}
{{ form | crispy }}
<input type="submit" value="Submit" class="btn btn-primary mb-3">
</form>
{% if messages %}
{% for message in messages %}
<div class="alert alert-danger d-flex align-items-center alert-dismissible fade show" role="alert">
<svg class="bi flex-shrink-0 me-2" role="img" aria-label="Danger:">
<use xlink:href="#exclamation-triangle-fill" />
</svg>
<div>
{{ message }}
</div>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endfor %}
{% endif %}
</div>
</div>
{% endblock %}
settings.py:
"""
Django settings for setup project.
Generated by 'django-admin startproject' using Django 4.1.
For more information on this file, see
https://docs.djangoproject.com/en/4.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.1/ref/settings/
"""
from pathlib import Path
import os
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-)9-rgl0du=62az)siilt%1qgacbtmgxt!ew97t8$&nzd1v)x53'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'mysite.apps.MysiteConfig',
'crispy_forms',
"crispy_bootstrap5",
"phonenumber_field",
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'setup.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
WSGI_APPLICATION = 'setup.wsgi.application'
# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'emmanuel',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '',
}
}
# Password validation
# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/4.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.1/howto/static-files/
STATIC_URL = 'static/'
STATICFILES_DIRS = [
]
# Default primary key field type
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# Crispy-forms template pack
CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
CRISPY_TEMPLATE_PACK = 'bootstrap5'
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.Argon2PasswordHasher',
'django.contrib.auth.hashers.ScryptPasswordHasher',
]
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
Documentations:
If you’re using the context processor, your template should be
rendered with a RequestContext. Otherwise, ensure messages is
available to the template context.
https://docs.djangoproject.com/en/4.1/ref/contrib/messages/#displaying-messages
you don't send messages or RequestContext in your context:
return render(request, 'register.html', {'form': form})
Probably it should be something like that:
return render(request, 'register.html', {'form': form, 'messages':get_messages(request)})

How can I redirect a user from the login page to the signup page in a different app Django?

So, I have been trying to do this problem for a couple of days, but I seem to be having no luck, in actually solving it.
For my side-project, I am creating a student grade management system in Django, and the problem that I am getting is that everytime the user clicks on the signup button on the homepage/login page, I get an error, because I haven't re-routed the user successfully. Specifically, the error I get is that it says, Page not Found.
The page that I am trying to re-route the user to is in another app. So, I'm trying to route the user to the base url of that app, which from there, it will pop open a view.
Here is the code for my urls.py on the loginpage/homepage (App1)
from django.urls import re_path
from django.shortcuts import redirect
# import signUpPage.views as signupview
from . import views
urlpatterns = [
re_path(r'^$', views.login, name='login'),
# re_path('signUpPage', signupview.register, name='signUpPage')
# re_path('')
]
Here is the code for my forms.py on the loginpage/homepage (App1)
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Fieldset, Layout
class loginForm(forms.Form):
UserName = forms.CharField(
label="Username",
help_text="Please enter your username",
widget=forms.TextInput(attrs={"placeholder":"Username"}),
required=False
)
Password = forms.CharField(
label="Password",
help_text="Enter your password",
widget=forms.TextInput(attrs={"placeholder":"Password"}),
required=False
)
Here is the code for my views.py on the loginpage/homepage (App2)
from django.shortcuts import render, redirect, HttpResponseRedirect
from . forms import loginForm
from django.urls import re_path
from signUpPage.views import register
# from .models import <Insert whatever it is you want to import, but it might not be nexessary>
def login(request):
if request.method == "POST":
redirect('signUpPage')
if request.POST.get("signup"):
register()
else:
form = loginForm(request.GET)
return render(request, 'homePage/homePage.html', {"form": form})
Here is the html for the loginpage/homepage (App1)
{% load static%}
{% load crispy_forms_tags %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}Home{% endblock %}</title>
<link rel="shortcut icon" type="image/png" href="{% static 'homePage/favicon.png' %}">
{% load bootstrap4 %}
<link href="../../static/homePage/homePage.css" type="text/css" rel="stylesheet">
</head>
<body>
<div class="homePage-background"> <!-- animation area-->
<svg class="container-sm" width="25%" height="760" style="position:absolute; margin-left: 35%; margin-top:35px">
<rect id="loginRect" width="100%" height="100%" rx="40px" ry="40px" style="fill: cornflowerblue; stroke: pink; stroke-opacity: 0.0; stroke-width: 3px; "/>
<foreignObject height="760" width="100%">
<div class="loginpage-form">
{% block content %}
<form action="homePage/forms.py" method="post">
{% csrf_token %}
{{forms|crispy}}
{% for field in form %}
<div class="fields">
<div class="label">{{field}}</div>
</div>
{% endfor %}
<button type="submit" name="login" class="btn btn-success" id="loginButton" formmethod="post">Login</button>
<button type="submit" name="signup" class="btn btn-success" id="signUpButton" formmethod="get">Sign Up</button>
</form>
{% endblock %}
</div>
</foreignObject>
</svg>
<ul class="animation"> <!-- box area-->
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>
</body>
</html>
Here is the code for my urls.py on the signuppage (App2)
from django.urls import re_path
from . import views
urlpatterns=[
re_path('^$', views.register, name='register'),
]
Here is the html for the signup page (App2)
<!DOCTYPE html>
<html lang="en">
{% load static %}
{% load crispy_forms_tags %}
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="../../static/signUpPage/signUpPage.css" type="text/css"/>
{% load bootstrap4 %}
<title>{% block title %}SignUp{% endblock %} </title>
</head>
<body>
<div id="backGround">
<div class="container-sm">
<h2>Sign Up</h2>
</div>
<div id="inputs">
<img src="../../static/signUpPage/SignUp-Person.png" alt="Signup Person Image" id="image">
<p id="inputText">Please enter your Email Address,<br/> Username, and Password.</p>
<div class="form-group">
{% block content %}
<form method="post">
{% csrf_token %}
{{ forms|crispy}}
{% for field in form %}
<div class="fields">
<label for="{{ field.id_for_label }}" class="label">{{field.html_name}}</label>
{{field}}
</div>
{% endfor %}
<button type="submit" class="btn btn-success" id="signup-button" value="user-credentials">Sign Up</button>
</form>
{% endblock %}
</div>
</div>
</div>
</body>
EDIT: Here is the settings.py file
"""
Django settings for GradingSystem project.
Generated by 'django-admin startproject' using Django 3.0.8.
For more information on this file, see
https://docs.djangoproject.com/en/3.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.0/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'h#yn1kty8in#qx#f#y4k6n$mzyc6q9o$ovlt5p=u=974ny#nq-'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'signUpPage.apps.SignuppageConfig',
'homePage.apps.HomepageConfig',
'grades.apps.GradesConfig',
'newcourse.apps.NewcourseConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'bootstrap4',
'crispy_forms',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'GradingSystem.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, '/templates'), os.path.join(BASE_DIR, 'homePage', 'templates', 'homePage'),
os.path.join(BASE_DIR, 'signUpPage', 'templates', 'signUpPage'),
os.path.join(BASE_DIR, 'grades', 'templates', 'grades')],
'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',
],
},
},
]
WSGI_APPLICATION = 'GradingSystem.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'student_accounts',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': 'root',
#This asks me for my password on runtime, because I do not feel comfortable writing my password here.
'PASSWORD': input("Password:"),
}
}
# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
CRISPY_TEMPLATE_PACK = 'bootstrap4'
in your urls.py file, you can add a constant with the name app_name="app_name" and in your HTML link or button, you can simply use the url tag like {% url app_name:path_name %}.
It tells the Django which specific urls.py file you are talking about.

Django Static file not loading ImageField URL

This is for an assignment, we need to store the images in the static directory and display them on a template. The images are stored through the item model ImageField and uploaded to the static/images directory.
Here is the template code:
{% load static %}
<p><a href='..'>Home</a></p>
{% block content %}
<table>
<tr>
<th>Item Name</th>
<th>Manufacturer</th>
<th>Cost</th>
<th>Weight</th>
<th>Image</th>
</tr>
{% for i in name %}
{% if i.name == params %}
<tr>
<td>{{i.name}}</td>
<td>{{i.manufacturer}}</td>
<td>{{i.cost}}</td>
<td>{{i.weight}}</td>
<td><img src="{% static i.image.url %}" alt="{{i.image.url}}"></img></td>
</tr>
{% endif %}
{% endfor %}
</table>
{% endblock %}
I have the following model code:
from django.db import models
class item(models.Model):
name = models.CharField(max_length=40)
manufacturer = models.CharField(max_length=255)
cost = models.DecimalField(max_digits=10, decimal_places=2)
weight = models.DecimalField(max_digits=10, decimal_places=2)
image = models.ImageField(upload_to='static/images/')
Here are the current settings
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'Nice try'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'mysite',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'mysite.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
WSGI_APPLICATION = 'mysite.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/
STATIC_URL = '/static/'
ALLOWED_HOSTS = ['*']
X_FRAME_OPTIONS = '*'
Currently, everything is displaying properly from the model class, however the images will not load after trying a million different tags for the img src. We are supposed to use static so please do not suggest using media directory for the images.
Thank you for the help.
Assuming in your views.py you have:
name = item.objects.all()
and then that the variable name is passed to your template,
try to substitute this
<td><img src="{% static i.image.url %}" alt="{{i.image.url}}"></img></td>
With this
<td><img src="{{ i.image.url }}" alt="{{i.image.url}}"></img></td>
However, I would suggest you to call the name variable by something more representative, like objects_list, then you will have
{% for i in objects_list %}
{% if i.name == params %}
<tr>
<td>{{i.name}}</td>
<td>{{i.manufacturer}}</td>
<td>{{i.cost}}</td>
<td>{{i.weight}}</td>
<td><img src="{% static i.image.url %}" alt="{{i.image.url}}"></img></td>
</tr>
{% endif %}
{% endfor %}
this is way more clear.

Django Session variables not updating properly

I am trying to figure out how sessions work. Basically I am trying to make a restaurant menu and store ordered food into session for further use. However, I ran into a problem and I cant figure out what might be the problem.
The problem is that if I submit the form 1st time. The success view shows the correct data.
I click Submit (pridat) and it works correctly
The output is:
('2', 1)
Where number 2 is food ID and 1 is the quantity.
Then I go back to the menu and I want to update the quantity to lets say 3
I change quantity (mnozstvo) to 3 and submit
But the output is still:
('2', 1)
The weirdest thing that has me confused is the fact that for example different food, even though it should be generated the same way works and updates just fine.
If I want to "order" multiple things it works fine with some and sometime one or multiple just refuse to update properly. As I am writing this 3 out of 4 works just fine.
('3', 5)('4', 8)('1', 15)('2', 1)
I can change 3-5, 4-8 and 1-15 but the 2-1 just never ever changes.
If I restart the built in django server sometimes different pair does not update properly. This time it is 2-1 but I also had an issue that 3-5 would not update.
So I would be really happy if someone could tell me what am I doing wrong? I know I am not letting django generate form but I rather do it manually in html, but that should not be the problem, should it?
menu.html with form separated for better visibility
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'restaurant/style.css' %}" />
{% if all_food_list %}
<center>
<ul>
<li>Home</li>
<li>Menu</li>
<li style="float:right"><a class="active" href="#about">Objednavka</a></li>
</ul>
<div class="clearfix">
{% for food in all_food_list %}
<div class="div1">
<center>
<img src="{{ MEDIA_URL }}{{ food.picture.url }}" alt="{{ food.name }}">
<h2> {{ food.name}} </h2>
<p>Cena: {{ food.price }}czk</p>
<p>Hmotnost: {{ food.weight}}g</p>
<p>Zlozenie: {{ food.ingredients}}</p>
<form action="/get_food/" method="post">
{% csrf_token %}
Mnozstvo: <input id="test" type="number" name="quantity" min="0" max="30" step="1" value="1">
<input type="hidden" name="food_type" value="{{ food.id }}">
<input type="submit" value="Pridat">
</form>
</center>
</div>
{% endfor %}
TODO: Funkcny formular, view pre objednavku, nastavit limity div-ov.
</div>
</center>
{% else %}
<p>No food available.</p>
{% endif %}
My views.py
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.template import loader
from .models import Food
from .forms import FoodOrder
def index(request):
template = loader.get_template('restaurant/index.html')
request.session.flush()
return HttpResponse(template.render(request))
def menu (request):
all_food_list = Food.objects.order_by('name')
template = loader.get_template('restaurant/menu.html')
context = {
'all_food_list': all_food_list,
}
return HttpResponse(template.render(context, request))
def get_food(request):
if request.method == 'POST':
form = FoodOrder(request.POST)
if form.is_valid():
quantity = form.cleaned_data['quantity']
#Food_type is db food id
food_type = form.cleaned_data['food_type']
#add to the session
request.session[food_type] = quantity
return HttpResponseRedirect('/success/')
else:
return HttpResponseRedirect('/index/')
def success(request):
#just writes the content of session
obsah = request.session.items()
return HttpResponse(obsah)
# Create your views here.
forms.py
from django import forms
class FoodOrder(forms.Form):
quantity = forms.IntegerField()
food_type = forms.IntegerField()
settings.py
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'restaurant.apps.RestaurantConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'iis_project.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
WSGI_APPLICATION = 'iis_project.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/1.10/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/
STATIC_URL = '/static/'
MEDIA_ROOT = 'D:\Škola\IIS\Projekt - Restaurace\media'
MEDIA_URL = '/media/'

Django: Static files don't show up in the website despite being referenced correctly

I've spent the entire day trying to figure out why the static files don't appear on the website despite being referenced correctly. My base template:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}Sinergia Creativa{% endblock %}</title>
{% load staticfiles %}
<link rel="shortcut icon" type="image/png" href="{% static 'favicon.ico' %}"/>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"/>
<link href='https://fonts.googleapis.com/css?family=Satisfy' rel='stylesheet' type='text/css'/>
<link rel="stylesheet" type="text/css" href="{% static 'publicidad/style.css' %}"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container-fluid">
<div class="row">
<nav class="navbar navbar-inverse">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#topNavBar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{% url 'publicidad:index' %}">Sinergia Creativa</a>
</div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="">
Promociones
</li>
<li class="">
Contacto
</li>
</ul>
</div>
</div>
</nav>
</div>
</div>
{% block body %}
{% endblock %}
</body>
</html>
My settings.py:
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DEBUG = True
ALLOWED_HOSTS = []
INSTALLED_APPS = [
'publicidad.apps.PublicidadConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'sinergia_creativa.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
WSGI_APPLICATION = 'sinergia_creativa.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
I have another project that is configured the same way and that one works so I'm puzzled.
My main problem is that the static files aren't being loaded at all despite actually being referenced and found without issues. I've used findstatic in the manage.py shell and it found them at the correct location. I used Firebug to look at what was being referenced at it was the correct path throwing me this
<link href="/static/publicidad/style.css" type="text/css" rel="stylesheet">
Reload the site to obtain the source code of: http://localhost:800/static/publicidad/style.css
I don't know what else to do. Other project worked fine under those settings. Let me know if you need any other information from the project.
Cheers, Datkros.
I don't see at settings.py define static file. Add more setting into settings.py (in my case static folder is in my project)
import os.path
# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
# ('static', os.path.join(BASE_DIR, 'static')),
os.path.join(BASE_DIR, 'static'),
)

Categories

Resources