I'm trying to create a small app in which a user can view an event, submit a form indicating the quantity of tickets they would like, view their basket and finally go to a checkout page.
My problem is that after I submit a form for event1, the value that is posted is lost when I try to view another event or refresh the basket. How can I prevent this from happening? I need to use Django to make use of a python module during the checkout process so I need to be able to retrieve the quantities submitted for any event in the final checkout view.
My views.py file:
def basket(request):
context = {'Event 1 Tickets': event1_tickets, 'Event 2 Tickets': event2_tickets}
return render(request, 'first_app/basket.html', context)
def event2(request):
form = forms.TicketForm()
form = forms.TicketForm(request.POST)
if request.POST:
if form.is_valid():
# form.save(commit=True)
quantity = form.cleaned_data['quantity']
return render(request,'first_app/basket.html',{'event2_tickets': form.cleaned_data})
else:
form = TicketForm()
return render(request, 'first_app/event2.html', {'form': form})
def event1(request):
form = forms.TicketForm()
form = forms.TicketForm(request.POST)
if request.POST:
if form.is_valid():
# form.save(commit=True)
quantity = form.cleaned_data['quantity']
return render(request,'first_app/basket.html',{'event1_tickets': form.cleaned_data})
else:
form = TicketForm()
return render(request, 'first_app/event1.html', {'form': form})
My forms.py:
from django import forms
class TicketForm(forms.Form):
quantity = forms.IntegerField(label="Ticket Quantity",min_value=1,max_value=9,required=True, widget=forms.NumberInput)
My event1/event2.html:
<!DOCTYPE html>
{% load static %}
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="{% static "css/style.css" %}"/>
</head>
<body>
<div class="topnav">
<a class="" href="{% url 'index' %}">Home</a>
Basket
</div>
<div>
<form action="" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit">
</form>
</div>
</body>
</html>
My static basket.html:
<!DOCTYPE html>
{% load static %}
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="{% static "css/style.css" %}"/>
<!-- <script src="{% static "javascript/script.css" %}"/></script> -->
</head>
<body>
<div class="topnav">
Home
<a class="active" href="{% url 'basket' %}">Basket</a>
</div>
<div>
<h1>Tickets for Event 1 {{ event1_tickets.quantity }}</h1>
<h1>Tickets for Event 2 {{ event2_tickets.quantity }}</h1>
</div>
<button type="button" class="button" onclick = "window.location.href='{% url 'checkout' %}' ">Checkout</button>
</body>
</html>
My urls.py file:
from django.conf.urls import url
from django.urls import path
from . import views
urlpatterns = [
path('checkout/', views.checkout, name='checkout'),
path('basket/', views.basket, name='basket'),
path('event1/', views.event1, name='event1'),
path('event2/', views.event2, name='event2'),
]
Related
I'm trying to learn Python and Django, when I try to upload a file in my form Django detect my file as "None".
forms.py:
from django import forms
class FormularioTrabajo(forms.Form):
email = forms.EmailField(label="Correo Electrónico:", max_length=254)
Currículum = forms.FileField()
views.py:
In views I want to save the file uploaded in the directory /media/
def trabaja(request):
if request.method == 'POST':
form = FormularioTrabajo(data=request.POST, files=request.FILES)
if form.is_valid():
file = request.FILES.get('file', None)
if file is not None:
file_name = file.name
file_path = '/media/' + file_name
with open(file_path, 'wb+') as destination:
for chunk in file.chunks:
destination.write(chunk)
form.save()
return HttpResponseRedirect(reverse("miapp:index"))
else:
return HttpResponse('None')
else:
form = FormularioTrabajo()
return render(request, "web/trabajar.html", {'form':form})
This is my template html:
{% load bootstrap5 %}
{% bootstrap_css %}
{% bootstrap_javascript %}
{% bootstrap_messages %}
<!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">
{% load static %}
<link rel="stylesheet" href="{% static '/style.css' %}">
<script src="https://cdn.jsdelivr.net/npm/bootstrap#5.2.2/dist/js/bootstrap.bundle.min.js"></script>
<title>Trabaja con nosotros</title>
</head>
<body>
<header>
<br>
<ul>
<li>Conócenos</li>
<li>Inicio de Sesión</li>
<li>Registro de usuario</li>
<li>Contacta con nosotros</li>
</ul>
{% load static %}
<img src="{% static 'img/logo.PNG'%}" class="logo">
</header>
<div class="work-box">
<h3>Solicitud de Trabajo</h3>
<form id="contactForm" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button class="btn btn-primary btn-lg" type="submit">Submit</button>
{% endbuttons %}
</form>
</div>
</body>
</html>
Please correct this line
if form.is_valid():
file = request.FILES.get('Currículum', None)
I'm creating a login, register account website and it works well except for when i use the render template command as it loads the page successfully but then the url of the page is the URL of the previous page and when I refresh it, it goes back to the previous page. But when I use the redirect(url_for command I'm not able to pass variables through it
class LoginForm(FlaskForm):
username= StringField(validators=[InputRequired(),Length(min=4,max=20)],render_kw={"placeholder":"Username"})
password= PasswordField(validators=[InputRequired(),Length(min=8,max=20)],render_kw={"placeholder":"Password"})
submit =SubmitField("Login")
#app.route("/login",methods= ['GET','POST'])
def login():
form=LoginForm()
print("in login html")
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user:
if user.password==form.password.data:
login_user(user)
print("password entered")
userUsername=form.username.data
#return redirect(url_for('dashboard',userUser=userUsername,))
return render_template("dashboard.html",userUser=userUsername)
else:
print("incorrect pass")
return render_template("login.html",form=form)
#app.route("/dashboard",methods= ['GET','POST'])
#login_required
def dashboard():
return render_template("dashboard.html")
this is my python code, my dashboard.html-
<!DOCTYPE html>
<html lang="en">
<head>
<title>Dashboard</title>
<link href = "../static/main.css" rel = "stylesheet">
</head>
<div class = "container1">
<body>
<div data-role="page" id="welcome" data-url="{{ url_for('dashboard') }}">
{%extends "layout.html"%}
{%block content%}
<p>{{userUser}}</p>
<h1>Hello you are logged in. </h1>
<div class = "container1">Welcome {{userUser}}!</div>
<form action ="{{url_for('login')}}" method = POST>
<br> <button type = "submit">Logout</button>
</form>
</div>
{%endblock%}
</body>
</html>
now my login.html
<!DOCTYPE html>
<html lang = "en">
<head>
<link href = "../static/main.css" rel = "stylesheet">
<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>Login</title>
</head>
<body>
<div class = "container">
<h1>Login</h1>
<form method="POST" actions="">
{{ form.hidden_tag() }}
{{ form.username }}
{{ form.password }}
{{ form.submit }}
</form>
Don't have an account? Sign Up
<div class = "message"> {{errorMessage | safe}}</div>
</div>
</body>
</html>
when i pass userUser through redirect(url_for it doesnt work but with render templates it does but the url remains /login
So i am building a personal website and am using Materialize for web designing. At first it was good and my pages look good, but then I added some new pages and i found that the css is not applied in these new pages, can anybody help me in solving this.
Actually both are same pages(categories.html) but the path are different.
header.html (main html file, have not changed the name yet)
<<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!--Import Google Icon Font-->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<!--Import materialize.css-->
<link type="text/css" rel="stylesheet" href="static/main/materialize.css" media="screen,projection"/>
</head>
<body>
{% load static %}
{% include "main/includes/navbar.html" %}
{% include "main/includes/messages.html" %}
<main>
<div style="background-image: url('https://www.google.com/url?sa=i&url=https%3A%2F%2Fwallpapersafari.com%2Fw%2FcU6JWo&psig=AOvVaw1eBAulQvnXOrIK1yQueVX5&ust=1623841457736000&source=images&cd=vfe&ved=0CAIQjRxqFwoTCPje9_--mfECFQAAAAAdAAAAABAD')">
<div class = "container">
<br>
{% block content %}
{% endblock %}
</div>
</div>
</main>
{% include "main/includes/footer.html" %}
<script type="text/javascript" src="static/main/materialize.js"></script>
</body>
</html>
views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import Item, ItemSeries, ItemCategory
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login, logout, authenticate
from django.contrib import messages
from .forms import NewUserForm
def single_slug(request, single_slug):
categories = [c.category_slug for c in ItemCategory.objects.all()]
if single_slug in categories:
matching_series = ItemSeries.objects.filter(item_category__category_slug=single_slug)
series_urls = {}
for m in matching_series.all():
part_one = Item.objects.filter(item_series__item_series=m.item_series).earliest("item_update")
series_urls[m] = part_one.item_slug
return render(request,
"main/category.html",
{"part_ones": series_urls})
items = [c.item_slug for c in Item.objects.all()]
if single_slug in items:
this_item = Item.objects.get(item_slug=single_slug)
return render(request,
"main/item.html",
{"item":this_item})
return HttpResponse(f"{single_slug} does not correspond to anything.")
def product(request):
return render(request = request,
template_name = "main/categories.html",
context ={"categories": ItemCategory.objects.all})
def homepage(request):
return render(request = request,
template_name = "main/categories.html",
context ={"categories": ItemCategory.objects.all})
def about(request):
return render(request = request,
template_name = "main/about.html",
context ={"categories": ItemCategory.objects.all})
def contact(request):
return render(request = request,
template_name = "main/contact.html",
context ={"categories": ItemCategory.objects.all})
def register(request):
if request.method == "POST":
form = NewUserForm(request.POST)
if form.is_valid():
user = form.save()
username = form.cleaned_data.get('username')
messages.success(request, f"New Account Created: {username}")
login(request, user)
messages.info(request, f"You are now logged in as: {username}")
return redirect("main:homepage")
else:
for msg in form.error_messages:
messages.error(request, f"{msg}: {form.error_messages[msg]}")
form = NewUserForm
return render(request,
"main/register.html",
context = {"form": form})
def logout_request(request):
logout(request)
messages.info(request, "Logged out successfully!")
return redirect("main:homepage")
def login_request(request):
if request.method == "POST":
form = AuthenticationForm(request, data = request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username = username, password = password)
if user is not None:
login(request, user)
messages.info(request, f"You are now logged in as: {username}")
return redirect("main:homepage")
else:
messages.error(request, "Invalid username or password")
else:
messages.error(request, "Invalid username or password")
form = AuthenticationForm()
return render(request,
"main/login.html",
{"form": form})
navbar.html
{% load static %}
<!-- Dropdown Structure -->
<ul id='dropdown1' class='dropdown-content'>
<li>one</li>
<li>two</li>
<li class="divider" tabindex="-1"></li>
<li>three</li>
<li><i class="material-icons">view_module</i>four</li>
<li><i class="material-icons">cloud</i>five</li>
</ul>
<nav>
<div id="nav-wrapper">
<div>
<ul class="center hide-on-med-and-down">
<li>
Home
</li>
<li>
About Us
</li>
<li>
Products
</li>
<li>
Services
</li>
<li>
Contact
</li>
<li>
<a class='dropdown-trigger btn' href='#' data-target='dropdown1'>Drop Me!</a>
</li>
</ul>
</div>
</div>
</nav>
categories.html
{% extends "main/header.html" %}
{% block content %}
<div class="row">
{% for cat in categories %}
<div class="col s12 m6 l4">
<a href="{{cat.category_slug}}", style="color:#000">
<div class="card hoverable">
<div class="card-content">
<div class="card-title">{{cat.item_category}}</div>
<p>{{cat.category_summary}}</p>
</div>
</div>
</a>
</div>
{% endfor %}
</div>
{% endblock %}
When CSS worked This is home page
When CSS did not work This is the same homepage after clicking 'about us' link form navbar
I am stuck and don't know what to do next, any help would be appretiated.
According to the comment above, i changed my header.html,
<<!DOCTYPE html> <html> <head> <meta charset="utf-8">
<!--Import Google Icon Font-->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<!--Import materialize.css-->
<link type="text/css" rel="stylesheet" href="/static/main/materialize.css" media="screen,projection"/>
</head>
<body>
{% load static %}
{% include "main/includes/navbar.html" %}
{% include "main/includes/messages.html" %}
<main>
<div style="background-image: url('https://www.google.com/url?sa=i&url=https%3A%2F%2Fwallpapersafari.com%2Fw%2FcU6JWo&psig=AOvVaw1eBAulQvnXOrIK1yQueVX5&ust=1623841457736000&source=images&cd=vfe&ved=0CAIQjRxqFwoTCPje9_--mfECFQAAAAAdAAAAABAD')">
<div class = "container">
<br>
{% block content %}
{% endblock %}
</div>
</div>
</main>
{% include "main/includes/footer.html" %}
<script type="text/javascript" src="/static/main/materialize.js"></script> </body> </html>
notice the href of css and js link tag.
There are a few things that I have seen here that don't look correct. Number 1, Are you inheriting your template from your base?
{% extends 'base.html' %}
This is where you should call your materialize.css (in the base template)
Load static is in the wrong place, you are calling static after the link to the css, load static should be at the very top of the template:
{% extends 'base.html' %} {% load static %}
You have an extra opening chevron in your DOCTYPE.
Put materialize js in you base template before closing body tag. Django by default inherits the default base template so this is what you could be missing.
In case I have misunderstood, and you are only wanting to call materialize.css for that header template you can use tags after the call for load static
{% block extra_css %}<link rel="stylesheet" href="{% static 'main/materialize.css' %}"> {% endblock extra_css %}
This might help:
{% load static %} above doctype tag!
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!--Import Google Icon Font-->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<!--Import materialize.css-->
<link type="text/css" rel="stylesheet" href="{% static 'main/materialize.css' %}" media="screen,projection"/>
</head>
<body>
{% include "main/includes/navbar.html" %}
{% include "main/includes/messages.html" %}
<main>
<div style="background-image: url('https://www.google.com/url?sa=i&url=https%3A%2F%2Fwallpapersafari.com%2Fw%2FcU6JWo&psig=AOvVaw1eBAulQvnXOrIK1yQueVX5&ust=1623841457736000&source=images&cd=vfe&ved=0CAIQjRxqFwoTCPje9_--mfECFQAAAAAdAAAAABAD')">
<div class = "container">
<br>
{% block content %}
{% endblock %}
</div>
</div>
</main>
{% include "main/includes/footer.html" %}
<script type="text/javascript" src="{% static 'main/materialize.js' %}"></script>
</body>
</html>
In every html page {% load static %} below {% block content %} and above the html of the page!
Static files path:
{% static 'app name/filefoldername' %}
Hope you understood! Look for some tutorials on youtube also!
Please help me with this query. I have a project to work on...
Thanks!!
HTML file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
<form method="post" class="post-form" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
</body>
</html>
Views.py file
You should add "action" attribute to your form so that the server can choose where to post the data. Add this attribute to your form tag:
action="{% url 'url_name' %}"
url_name here is the name in urlpatterns to receive a request from the form
For example:
urlpatterns = [
path('url_name/', views.index, name = 'url_name'),
]
Views:
def index(request):
if request.method == 'POST':
print("Valid")
student = Studentform(request.POST, request.FILES)
if student.is_valid():
handle_uploaded_file(request.FILES['file'])
student.save() # <== HERE
return HttpResponse('File uploaded successfully')
else:
return HttpResponse('Not uploaded')
else:
student = Studentform()
return render(request, 'name_of_your_upload.html', {'student': student})
Template:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
<form method="post" class="post-form" enctype="multipart/form-data">
{% csrf_token %}
{{ student.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
</body>
</html>
Here is my html file of landing page.
{% load static %}
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<link rel="stylesheet" href="{% static 'css/base.css' %}">
</head>
<body>
<div class="center-column">
<form method="POST" action="/">
{% csrf_token %}
{{form.title}}
<input class="btn btn-info" type="submit" name="Create Task">
</form>
<div class="todo-list">
{% for task in tasks %}
<div class="item-row">
<a class="btn btn-sm btn-info" href="{% url 'update_task' task.id %}">Update</a>
<a class="btn btn-sm btn-danger" href="{% url 'delete' task.id %}">Delete</a>
{% if task.complete == True %}
<strike>{{task}}</strike>
{% else %}
<span>{{task}}</span>
{% endif %}
</div>
{% endfor %}
</div>
</div>
</body>
</html>
Here is Models.py file where a table is created
class Task(models.Model):
title = models.CharField(max_length=200)
complete = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
Error i am getting
OperationalError at /
no such table: tasks_task
C:\Users\91870\Desktop\Django\todo\tasks\templates\tasks\list.html, error at line 15
line 15 is
{% for task in tasks %}
here is views.py file
def index(request):
tasks = Task.objects.all()
form = TaskForm()
if request.method =='POST':
form = TaskForm(request.POST)
if form.is_valid():
form.save()
return redirect('/')
return render(request, 'tasks/list.html', {'tasks':tasks, 'form':form})
It was working when i haven't applied the css but now it isn't.
Can someone please help me with this