Skip to content
Snippets Groups Projects
Commit bb30f917 authored by Sofiane Lasri's avatar Sofiane Lasri
Browse files

TP8 terminé

parent 6667af33
No related branches found
No related tags found
No related merge requests found
from django.forms import ModelForm
from applipizza.models import Ingredient, Composition
from applipizza.models import Ingredient, Composition, Pizza
class IngredientForm(ModelForm):
......@@ -12,3 +12,8 @@ class CompositionForm(ModelForm):
class Meta:
model = Composition
fields = ['ingredient', 'quantite']
class PizzaForm(ModelForm):
class Meta:
model = Pizza
fields = ['nom', 'prix', 'image']
# Generated by Django 4.2 on 2023-05-23 09:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('applipizza', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='pizza',
name='image',
field=models.ImageField(blank=True, null=True, upload_to='images/'),
),
]
from django.core.validators import validate_image_file_extension
from django.db import models
......@@ -7,6 +8,7 @@ class Ingredient(models.Model):
id = models.AutoField(primary_key=True)
nom = models.CharField(max_length=50, verbose_name="Nom de l'ingrédient")
def __str__(self) -> str:
return self.nom
......@@ -16,6 +18,7 @@ class Pizza(models.Model):
id = models.AutoField(primary_key=True)
nom = models.CharField(max_length=50, verbose_name="Nom de la pizza")
prix = models.FloatField(verbose_name="Prix de la pizza")
image = models.ImageField(upload_to='images/', validators=[validate_image_file_extension])
def __str__(self) -> str:
return self.nom
......
......@@ -95,6 +95,12 @@ header {
margin-top: 1rem;
}
.white-bg {
background-color: white;
border-radius: 5px;
padding: .5rem;
}
.page-content .container {
box-sizing: border-box;
background-color: white;
......@@ -102,6 +108,10 @@ header {
padding: .5rem;
}
.page-content .container.no-padding {
padding: 0;
}
footer {
background-color: #EFEFEF;
left: 0;
......
{% extends 'applipizza/base.html' %}
{% load static %}
{% block title %}
Lasri Del Arte - Pizza {{ pizza }}
{% endblock %}
{% block content %}
<div class="container">
<h2>Modifier la pizza {{ pizza }}</h2>
<p>Ici vous pouvez modifier la pizza.</p>
<h3>Ajouter un ingrédient</h3>
<form action="/pizza/{{ pizza.id }}/update/post" method="post" enctype="multipart/form-data" class="form-stacked">
{% csrf_token %}
{% for field in form %}
{% if field.errors %}
<div class="clearfix error">
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
<div class="input">
{{ field }}
<span class="help-inline">
{% for error in field.errors %}
{{ error }}
{% endfor %}
</span>
</div>
{% else %}
<div class="clearfix">
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
<div class="input">
{{ field }}
</div>
</div>
{% endif %}
{% endfor %}
<div class="actions">
<input type="submit" value="Enregistrer" class="btn success">
<button type="reset" class="btn">Annuler</button>
</div>
</form>
</div>
{% endblock %}
{% block javascripts %}
<script type="text/javascript" src="{% static 'applipizza/js/bootstrap-alerts.js' %}"></script>
<script type="text/javascript" src="{% static 'applipizza/js/jquery.tablesorter.min.js' %}"></script>
<script type="text/javascript">
$(document).ready(function () {
$('#composition').tablesorter({sortList: [[0, 1]]});
});
var form = $('form');
var formRequiredFields = form.find('input[required]');
var formSubmitButton = form.find('input[type=submit]');
// We disable form validation
form.attr('novalidate', 'novalidate');
form.submit(function (e) {
formRequiredFields.each(function () {
if ($(this).val() == '') {
console.log('empty');
e.preventDefault();
$(this).parent().append('<span class="help-inline">Ce champ est obligatoire</span>');
$(this).parent().parent().addClass('error');
} else {
if ($(this).parent().find('span.help-inline').length > 0) {
$(this).parent().find('span.help-inline').remove();
$(this).parent().parent().removeClass('error');
}
}
});
});
// We disable the submit button
//formSubmitButton.attr('disabled', 'disabled');
</script>
{% endblock %}
\ No newline at end of file
......@@ -8,6 +8,20 @@
{% block content %}
<div class="container">
{% if status %}
{% if status == 'success' %}
<div class="alert-message success" data-alert>
<a class="close" href="#">×</a>
<p><strong>Opération réussie !</strong></p>
</div>
{% endif %}
{% if status == 'error' %}
<div class="alert-message error" data-alert>
<a class="close" href="#">×</a>
<p><strong>Erreur !</strong> L'opération a échouée.</p>
</div>
{% endif %}
{% endif %}
<h2>Pizza {{ pizza }}</h2>
<p>Une délicieuse pizza traditionnelle.</p>
......@@ -30,20 +44,6 @@
</tbody>
</table>
{% if status %}
{% if status == 'success' %}
<div class="alert-message success" data-alert>
<a class="close" href="#">×</a>
<p><strong>Enregistré !</strong> L'ingrédient {{ nomIngredient }} a bien été ajouté.</p>
</div>
{% endif %}
{% if status == 'error' %}
<div class="alert-message error" data-alert>
<a class="close" href="#">×</a>
<p><strong>Erreur !</strong> L'ingrédient n'a pas pu être ajouté.</p>
</div>
{% endif %}
{% endif %}
<h3>Ajouter un ingrédient</h3>
<form action="/pizza/{{ pizza.id }}/addIngredient" method="post" class="form-stacked">
{% csrf_token %}
......@@ -69,8 +69,10 @@
{% endif %}
{% endfor %}
<div class="actions">
<input type="submit" value="Ajouter" class="btn primary">
<input type="submit" value="Ajouter" class="btn success">
<button type="reset" class="btn">Annuler</button>
<a href="/pizza/{{ pizza.id }}/update" class="btn info">Modifier la pizza</a>
<a href="/pizza/{{ pizza.id }}/delete" class="btn danger">Supprimer la pizza</a>
</div>
</form>
</div>
......
......@@ -15,7 +15,9 @@
{% for p in pizzas %}
<div class="card">
<div class="header">
<img class="logo" src="{% static 'applipizza/img/margherita.jpg' %}" alt="{{ p.nom }}">
<div class="logo">
<img src="{% get_media_prefix %}{{ p.image }}" alt="{{ p.nom }}">
</div>
</div>
<div class="body">
<h5>{{ p.nom }}</h5>
......
from django.shortcuts import render
from applipizza.models import Pizza, Ingredient, Composition
from applipizza.forms import IngredientForm, CompositionForm
from applipizza.forms import IngredientForm, CompositionForm, PizzaForm
# Create your views here.
def pizzas(request):
......@@ -13,21 +13,7 @@ def pizzas(request):
def pizza(request, id):
formulaire = CompositionForm()
pizza = Pizza.objects.get(id=id)
composition = Composition.objects.filter(pizza_id=id)
compositionArray = []
for c in composition:
compositionArray.append([Ingredient.objects.get(id=c.ingredient_id).nom, c.quantite])
pizza.composition = compositionArray
return render(
request,
'applipizza/pizza.html',
{'pizza': pizza, 'form': formulaire}
)
return viewPizza(request, id)
def formulaireCreationIngredient(request):
formulaire = IngredientForm()
......@@ -74,8 +60,63 @@ def ajouterIngredientDansPizza(request, id):
composition = Composition(ingredient=ingredient, quantite=quantite, pizza=pizza)
composition.save()
return viewPizza(request, id, 'success')
def supprimerPizza(request, id):
pizza = Pizza.objects.get(id=id)
pizza.delete()
composition = Composition.objects.filter(pizza_id=id)
composition.delete()
pizzas = Pizza.objects.all()
return render(
request,
'applipizza/pizzas.html',
{'pizzas': pizzas}
)
def modifierPizza(request, id):
pizza = Pizza.objects.get(id=id)
formulaire = PizzaForm(instance = pizza)
return render(
request,
'applipizza/formulaireModificationPizza.html',
{'pizza': pizza, 'form': formulaire}
)
def traitementFormulaireModificationPizza(request, id):
pizza = Pizza.objects.get(id=id)
form = PizzaForm(request.POST, request.FILES)
if form.is_valid():
pizza.nom = form.cleaned_data['nom']
pizza.prix = form.cleaned_data['prix']
pizza.image = request.FILES['image']
pizza.save()
return viewPizza(request, id, 'success')
else:
return viewPizza(request, id, 'error')
def viewPizza(request, id, status=None):
formulaire = CompositionForm()
pizza = Pizza.objects.get(id=id)
composition = Composition.objects.filter(pizza_id=id)
compositionArray = []
for c in composition:
compositionArray.append([Ingredient.objects.get(id=c.ingredient_id).nom, c.quantite])
pizza.composition = compositionArray
if status==None:
return render(
request,
'applipizza/pizza.html',
{"pizza": pizza, 'form': formulaire}
)
else:
return render(
request,
'applipizza/pizza.html',
{"pizza": pizza, "status": "success"}
{"pizza": pizza, 'form': formulaire, 'status': status}
)
\ No newline at end of file
......@@ -126,3 +126,5 @@ STATIC_URL = 'static/'
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
MEDIA_ROOT = BASE_DIR/'media'
MEDIA_URL = '/media/'
\ No newline at end of file
......@@ -17,12 +17,20 @@ Including another URLconf
from django.contrib import admin
from django.urls import path
from applipizza import views
from django.conf import settings # new
from django.urls import path, include # new
from django.conf.urls.static import static # new
urlpatterns = [
path('admin/', admin.site.urls),
path('pizzas/', views.pizzas),
path('pizza/<int:id>', views.pizza),
path('pizza/<int:id>/addIngredient', views.ajouterIngredientDansPizza),
path('pizza/<int:id>/update', views.modifierPizza),
path('pizza/<int:id>/update/post', views.traitementFormulaireModificationPizza),
path('pizza/<int:id>/delete', views.supprimerPizza),
path('ingredients/add', views.formulaireCreationIngredient),
path('ingredients/add/post', views.creerIngredient),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) #new
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment