Revision Django

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 27

Amdouni Mouna 4 Twin 6

● Creation Projet:

Erreur me3rafch django : cd examen1


pip install django

Dima nekhdem b nom l vue hata ken fel url


nansech / fi ekher l path

1. pip install virtualenv


2. pip install django
3. python -m venv examen1
4. examen1\scripts\activate
5. pip install django
6. django-admin startproject examen1 .
7. pip install pillow
8. django-admin startapp users
9. django-admin startapp events

python manage.py runserver


python manage.py makemigrations events
python manage.py makemigrations users
python manage.py migrate

Settings.Py f lekher
10. MEDIA_URL ='media/' # houni media/ yaani les fichiers w ila images ... yethatou f west media w
ena deja fel model 7atyt images yaani taswira tetsed f west dossier /media/images
11. MEDIA_ROOT ='media/'
12. AUTH_USER_MODEL = "users.Person" # pour specifier le model utilisateur
13. LOGOUT_REDIRECT_URL="login" # pour que lorsque l'utilisateur se deconnecte ou il va
rediriger
14. urls.py
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)

Settings.Py : creation nom de la base // nlawej aala section DATABASES


15. DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'test1.sqlite3',
}
}
Amdouni Mouna 4 Twin 6

par defaut kol model aandou clé primaire ID:w ena najem
nbaddlou(cin=models.CharField(primary_key=True,max_length=8,Validators=[cin_valid]))
kol menajouty model lezmou yerity mel models.model pour que notre model aura toutes les
fonctionnalités et les comportements fournis par la classe Model
fel user me3mlthech khater deja l user yerity mel abstractUser w l abstract user deja terity mel
models.model

Migration base de données

Hajet 9bal l migration:


1. f settings .py fel installed_apps: nhot asemni l es applications
mte3i
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'events',
'users'
]
2. w ken jetni erreur mte3 Participation eli hiya tarbet bin
person w event nthabbet mel unique together lezem ykounou
fiha nafs les attributs eli 7atythom fel classe participation

class Participation(models.Model):
event = models.ForeignKey(Event,
on_delete=models.CASCADE)
person = models.ForeignKey(Person,
on_delete=models.CASCADE)
participation_date =
models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('person', 'event')
3. Erreur Migration:
● nthabbet eli les attribiuts lkol maktoubin b minuscule
w nfassakh dossiers migration mes les 2 applications
mte3i events, users,w nfassakh dbsql mte3i
● n3awed les commanses de migrations

Commandes migrations base: nhot esm l app mouch l model


python manage.py makemigrations events
python manage.py makemigrations users
python manage.py migrate
Amdouni Mouna 4 Twin 6

Model1:fi models.py : user Model2:models.py:event


ken 9ali entité ta3mel heritage mel user ⇒ yerity mel models.model
deja f django aana entité hadhra mte3 user
from datetime import date
from django.contrib.auth.models import AbstractUser
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.core.validators import MinValueValidator
# Create your models here. from django.db import models
def cin_valid(val):
if len(val) != 8: from users.models import Person
raise ValidationError("La longuer doit etre egal a
8")
return val # Create your models here.
def email_valid(val): def valid_Title(title):
if str(val).endswith('@esprit.tn')==False: if not title[0].isupper():
raise ValidationError('Email doit se terminer par raise ValidationError("titre doit commencer par une majuscule")
@esprit.tn')
class Person(AbstractUser):
def valid_nbe_participant(val):
cin=models.CharField(primary_key=True,max_length if not val < 0:
=8,Validators=[cin_valid]) raise ValidationError("nombre doit etre positif")
Email=models.EmailField(Validators=[email_valid])
username =
models.CharField(unique=True,max_length=255) class Event(models.Model):
def __str__(self): title = models.CharField(max_length=255, blank=False,
return f"the person is {self.username}" # zedt f validators=[valid_Title])
bech ywalli ya9ra les variables w ila expression f west Description = models.TextField()
chaine de careceters image = models.ImageField(upload_to="images/") # installer pillow
Choix = (
('Musique', 'Musique'),
('Cinema', 'Cinema'),
('Sport', 'Sport'),

)
category = models.CharField('category', choices=Choix,
Amdouni Mouna 4 Twin 6

max_length=8)
state = models.BooleanField(default=False)
#
nbe_participant=models.IntegerField(default=0,validators=[valid_nbe
_participant])
nbe_participant = models.IntegerField(default=0, validators=[
MinValueValidator(limit_value=0, message="le nombre doit etre
positif")])
evt_date = models.DateField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# relation *--1 bin l person w event , kol event yorganiziha person
wehed w w plusieurs persons ynajmou yahdhrou
# f event evenemnt lié ken l person wheed
organizer = models.ForeignKey(Person,
on_delete=models.CASCADE)
# relation *--* bin l person w event / related_name=hiya esm l
relation bin l person w event==>
# Person.participations=+> lesm fel person
participations = models.ManyToManyField(Person,
related_name="participations", through='Participation')

class Meta:
constraints = [
models.CheckConstraint(
check=models.Q( # Q yaani bech nasna3 requete
evt_date__gte=date.today() # >=
),
name="the event date is invalid" # nom Contrainte
)
]

# Classe Poteuse
class Participation(models.Model):
# participation lié l event wahda
event = models.ForeignKey(Event, on_delete=models.CASCADE)
# participation lié ken l person whed
person = models.ForeignKey(Person, on_delete=models.CASCADE)
participation_date = models.DateTimeField(auto_now_add=True)
# houni class Meta sta3mltha lel unicité yaani fel base nal9ach f
classe Participation nafs les donnees m3awdin
# kol person ynajem yparticipi mara khw l evenement wahda mouch
barcha marrta
# yaani il suffit 3mal participation wahda khw meaach ynajem
class Meta:
unique_together = (person , event )

● Contraintes
Amdouni Mouna 4 Twin 6

clé primaire de 8
caractères Fonction de validation:

def cin_valid(val):
if len(val) != 8:
raise ValidationError("La longuer doit etre egal a 8")
return val

cin=models.CharField(primary_key=True,max_length=8,Validators=[cin_valid])

Email
Fonction de validation:

def email_valid(val):
if str(val).endswith('@esprit.tn')==False:
raise ValidationError('Email doit se terminer par @esprit.tn')

Email=models.EmailField(Validators=[email_valid])

Champs unique

username = models.CharField(unique=True,max_length=255)

Champs obligatoire
blank=false et doit Fonction de validation:
commencer par def valid_Title(title):
majuscule if not title[0].isupper():
raise ValidationError("titre doit commencer par une majuscule")

title=models.CharField(max_length=255,blank=False,validators=[valid_Title])
Amdouni Mouna 4 Twin 6

Champs
Multilignes

Description=models.TextField()

Images

image=models.ImageField(upload_to="images/") # installer pillow


// njansech configuration settings.py w install Pillow

Choix liste
deroulante

Choix=(
('Musique','Musique'),
('Cinema','Cinema'),
('Sport','Sport'),

)
category=models.CharField('category',choices=Choix,max_length=8)

Champs boolean

state=models.BooleanField(default=False)

Nombre Positif
, par defaut=0 Fonction de validation:
def valid_nbe_participant(val):
if not val<0:
raise ValidationError("nombre doit etre positif")

# nbe_participant=models.IntegerField(default=0,validators=[valid_nbe_participant])
nbe_participant=models.IntegerField(default=0,validators=[MinValueValidator(limit_value
=0,message="le nombre doit etre positif")])
Amdouni Mouna 4 Twin 6

Created_at
Updated_at

created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(auto_now=True)

Definition date
doit etre > de la
date
d’aujourd’hui evt_date=models.DateField()
dans la classe class Meta:
constraints=[
Meta models.CheckConstraint(
check=models.Q( #Q yaani bech nasna3 requete
evt_date__gte= date.today() # >=
),
name="the event date is invalid" # nom Contrainte
)
]

En résumé, la classe Meta est utilisée pour fournir des métadonnées supplémentaires au
modèle, tandis que les méthodes de validation personnalisées sont utilisées pour effectuer des
vérifications spécifiques sur les données du modèle.
Amdouni Mouna 4 Twin 6

● Generation Admin:

Creation un python manage.py createsuperuser


utilisateur admin // lezemni nasna3 user type admin b les contraintes eli deja 7atythom par exemple emil ken
nektebha metoufech b @esprit.tn ykharejli erreur ‘ emeil doit se terminer par @esprit.tn’

run project python manage.py runserver


http://127.0.0.1:8000/admin/
nekteb admin admin (eli 7atthom ena ki sna3t l user)
ken nekliki aala logout w ena mesna3tech deja login tjini hedhy :
NoReverseMatch at /admin/logout/
Reverse for 'login' not found. 'login' is not a valid view function or pattern name.

users todherli fel admin.site.register(Person)


espace admin

hedha lkol fi admin .py


ke nheb ki nekcliki fi admin.py mte3 users
aal users fel espace 1. soit hakka
class PersonAdmin(admin.ModelAdmin):
admin yodherli list_display = ('username','first_name', 'last_name','email','is_staff')
tableau fih les …..
champs lkol Liste admin.site.register(Person,PersonAdmin)
2. soit hakka
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
….
3. le fait que na3mel hakka yekfi bech todhherli events fel dash admin
@admin.register(Event)
class eventAdmin(admin.ModelAdmin):
pass

@admin.register(Person): decorateur

filtrage filtrage b attribut wehed


list_filter = ('cin', )
filtrage plus d’un attribut
list_filter = ('cin', 'email')
list_filter = ('is_staff','is_active',)

ordre ordering = ('cin', 'email', 'username')

recherche search_fields= ['cin','username']


Amdouni Mouna 4 Twin 6

ki nekiliki aal ligne fieldsets = (


m tableau yhezni l (
page fiha jomla en None, # meyodhherli chay ka titre
{"fields": ("cin", "username", "password")}
plus des champs
),
najem modifier w (
ila supprimer "Personal info",
{
"fields": (("first_name", "last_name"), "email")}
# FN w LN yodhhrou maa baadhhom w email todhher wahadha
),
(
"Permissions",
{
"fields": (
"is_active",
"is_staff",
"is_superuser",
"groups",
"user_permissions",
),
},
),
(("Important dates"), {"fields": ("last_login", "date_joined")}),
)

variable non readonly_fields = ('date_joined',)


editable

ajouter des actions : def set_to_Refuse(self, request, queryset):


accept/ Refuse + rows_NoValid = queryset.filter(state=False)
if rows_NoValid.count() > 0:
alertes + changer messages.error(
nom dans la zone request, f"{rows_NoValid.count()} events are already marked as Not Accepted")
action else:
rows_updated = queryset.update(state=False)
if rows_updated == 1:
message = "1 event was"
else:
message = f"{rows_updated} events were"
self.message_user(request, level='success',
Amdouni Mouna 4 Twin 6

message="%s successfully marked as Not Accepted" % message)

set_to_Refuse.short_description = "Refuse"
def set_toaccept(self, request, queryset):
rows_Valid=queryset.filter(state=True)
if rows_Valid.count() > 0:
messages.error(
request, f"{rows_Valid.count()} events are alread marked accepted"
)
else:
rows_updated= queryset.update(state=True)
if rows_updated ==1:
message = "1 event was "
else :
message= f"{rows_updated} events were"
self.message_user(request, level="success",
message="%s succesfully marked as accepted" %message
)

set_toaccept.short_description="Accept"
actions = [set_to_Refuse,set_toaccept]
Pagination list_per_page= 1

Filtrage par date ou class ParticipantFilter(admin.SimpleListFilter):


bien par nombre de title = 'NBR Participant' # houni nhot eli bech yji ba3d By ...=> By NBR Participant
parameter_name = 'nbe_participant' # esm l parametre eli bech nfalter bih
participants w
nzidha f list filter def lookups(self, request, model_admin):
return (('0', ("No Participants")), ('more', ("More participants"))) # houni teht l by bech
yodhrouli hajtyn :
# No participants w tekho valeur fel requete
0=>http://127.0.0.1:8000/admin/events/event/?nbe_participant=0
filtre selon le # More participants w tekhou valeur fel requete more
nombre de ==>http://127.0.0.1:8000/admin/events/event/?nbe_participant=more
participants
def queryset(self, request, queryset): # houni nfalter ken fel parametre aandi 0 nwalli nfalter
selon eli meaandhomch jemla participants
if self.value() == '0':
return queryset.filter(nbe_participant__exact=0)
Un filtre selon la if self.value() == 'more': # sinon houni nwalli nfalter selon l event eli aandou nbPartcip >
date de l’évènement strict m 0
selon trois critères : return queryset.filter(nbe_participant__gt=0)
« Past Events »,
class DateFilter(admin.SimpleListFilter):
«Upcoming Events » title = 'Date evenement'
et « Today Events ». parameter_name = 'date_evt'
def lookups(self, request, model_admin):
return (
( 'Past events',("Past events") ), # l valeur loul howa illi yekhouh fel params
( 'Coming events',("Coming events") ),
( 'Today events',("Today events") )
)
def queryset(self, request, queryset):
if self.value() == 'Past events':
return queryset.filter(evt_date__lt=datetime.today())
if self.value()== 'Coming events':
return queryset.filter(evt_date__gt=datetime.today())
if self.value()=='Today events':
Amdouni Mouna 4 Twin 6

return queryset.filter(evt_date__exact=datetime.today())
class eventAdmin(admin.ModelAdmin):

list_filter = ('state', 'category', ParticipantFilter, DateFilter)

autoComplete autocomplete_fields=['organizer']

f change aandi show fieldsets =(


w hide
('Event State' , {
'classes' :('collapse',),
'fields' : ('state',)
}) ,

('About' ,
{ 'classes' :('collapse',),
'fields' :('title','Description','image','category','nbe_participant','organizer')
}
),
('Dates',
{ 'classes' :('collapse',),
'fields' :('evt_date','updated_at','created_at')
}
)
)

nzidhaja okhra ghir gestion mte3 les evenements w m3aha fard espace (fard
fichier fel event)
@admin.register(Participation)
class participationAdmin(admin.ModelAdmin):
list_display = ('participation_date', 'event', 'person')
list_filter = ('participation_date', 'event', 'person')
ordering = ('participation_date', 'event', 'person')
search_fields = ['participation_date']

Tabular Inline class ParticipationInline(admin.TabularInline):


model = Participation
extra = 1
Inlines readonly_fields = ('participation_date',)
can_delete = True

class eventAdmin(admin.ModelAdmin):
inlines = [ParticipationInline,]
Amdouni Mouna 4 Twin 6

StackedInline
class ParticipationInline(admin.StackedInline):
model = Participation
extra = 1
readonly_fields = ('participation_date',)
Inlines can_delete = True

Nombre de def Participant_number(self,obj):


participation de val=obj.participations.count()
return val
chaque evenement
list_display = ('title', 'category', 'state', 'Participant_number','created_at', 'evt_date',)

● Partie client:
Views.py

urls.pyf est l projet lekbir mouch f west l


NB:
application(users/events) ki nid ay urls f ay apps (events/urls.py) fel urls.py fi west
projet
urlpatterns = [
path('admin/', admin.site.urls),
Amdouni Mouna 4 Twin 6

path('events/', include('events.urls')),
]

NB2 Settings.py f examen 1 win kol chay bel kbir


TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [ BASE_DIR / 'examen1/Templates'],
'APP_DIRS': True,
'OPTIONS': {

Nzid dossier static lele bootstrap f west l projet men bara


f settings.py

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

STATIC_URL = 'static/'

STATICFILES_DIRS = [BASE_DIR /'static/']

afficher simple message

events/urls.py views.py
from django.http import
from .views import * HttpResponse
from django.urls import path from django.shortcuts import render

urlpatterns = [ # Create your views here.


path('home/', HomePage def HomePage(request):
,name="homePage")] return HttpResponse('<h1>Hello
from home page</h1>')

http://127.0.0.1:8000/events/home/
Amdouni Mouna 4 Twin 6

Fonctions def
● Liste

afficher views.py events/urls.py


liste des def ListEvent(request):
list = Event.objects.filter(state=True) path('list/',
evenements # list =Event.objects.all()
# list =Event.objects.filter(title__startswith="e")
ListEvent,name=" list_event
# list =Event.objects.filter(Q(title__iregex = r'^[a-zA-Z]')) s_view
# list = Event.objects.filter(~Q(title__iregex=r'^[0-9]')) # ~ == not ")]
Def
Fonction return render(request, 'events/EventList.html', {'events': list})

examen1/Templates/events/EventList.html

{% block content %}
<div>
<div class="d-flex m-5 flex-wrap">
{% for e in events %}

<div class="card mx-5" style="width: 18rem">


<img src="{{ e.image.url }}" class="card-img-top" alt="..." />

<div class="card-body">
<h5 class="card-title">{{e.title}}</h5>

<p class="card-text">{{e.Description}}</p>
<p class="card-text">{{e.nbe_participant}}</p>

</div>
<div class="card-footer">
<small class="text-muted">{{e.evt_date}}</small>
</div>
</div>

{% endfor %}
</div>
</div>
{% endblock content %}

http://127.0.0.1:8000/events/list/
Amdouni Mouna 4 Twin 6

● Ajouter (Formulaire wahdi)


<a href="{% url 'add_event' %}" class="btn btn-success">Add Event</a>
<br/>

ajouter Un events/forms.py # nasna3ha manuellement events/views.py


evenement from django import forms
from users.models import Person def add_event(req):
from .models import Event form = EventForm()
if req.method == "POST":
3adeya bel CHOIX = ( form = EventForm(req.POST,
('Musique', 'Musique'), req.FILES)
event form ('Cinema', 'Cinema'), if form.is_valid():
('Sport', 'Sport') #print(**form.cleaned_data) **
⇒ nasna3 ) pour deballer le dictionnaire
ena l cleaned_data
#print(form.cleaned_data) ==>
formulaire class EventForm(forms.Form): yaffichili les donnees eli dakhelthom ena
fel formulaire
title = forms.CharField(label="Title")
wahdi Description = forms.CharField(label="Description",
widget=forms.Textarea(attrs={
Event.objects.create(**form.cleaned_da
'class': 'form-control'
ta) # tasna3 objet Event en utilisant les
}))
donnees nettoyés du formulaire
image = forms.ImageField(label="Event Image")
return
category = forms.ChoiceField(label="category",
Form choices=CHOIX, redirect(' list_events_view')
widget=forms.RadioSelect()) else:
nbe_participant = forms.IntegerField(min_value=0) print(form.errors)
evt_date = forms.DateField( return render(req,
label="Event Date",
"events/event_form.html", {'form':
widget=forms.DateInput(attrs={
'type': 'date', form})
'class': 'form-control date-input'
})
) urls.py
organizer = urlpatterns = [
path('home/', HomePage ,name="homePage"),
forms.ModelChoiceField(label="Organizer", path('list/', ListEvent

queryset=Person.objects.all()) ,name="list_events_view"),

path('AjouterEvent/', add_event
,name="add_event"),]

#'list_events_view'
mawjouda fel urls.py w hiya esm
l view mte3 lista

examen1/Templates/events/event_form.html
{% block content %}
<form method="POST" action="" enctype="multipart/form-data">
{% csrf_token %}
Amdouni Mouna 4 Twin 6

{{form.as_p}}
<input type="submit" value="Save Data" class="btn btn-primary" />
<input type="reset" value="Cancel" class="btn btn-primary" />
</form>

{% endblock %}

form.as_p bech tnadjhemli l formulare sous forme de paragraphe


{% csrf_token %} : pour proteger le site des falsification et proteger le
formulaire

http://localhost:8000/events/AjouterEvent/
Amdouni Mouna 4 Twin 6

● Ajouter (ModelForm form auto)

ajouter Un events/forms.py # nasna3ha manuellement events/views.py


evenement class EventModelForm(forms.ModelForm):
def createEventModelForm(req):
class Meta:
if req.method=='GET':
model=Event
form=EventModelForm()
b fields=['title','Description','image','nbe_participant','evt_dat return
formulaire e','organizer']
exclude=('state',)
render(req,'events/event_form.html',{'fo
rm':form})
automatiqu # widgets = {
# 'evt_date': forms.DateInput(
if req.method == 'POST':
form=EventModelForm(req.POST,
e # attrs={ req.FILES)
# 'type': 'date', if form.is_valid():
# 'class': 'form-control date-input', Event=form.save(commit=False)
# 'label': 'Tapez la date de l\'événement', Event.save()
# } return redirect('list_events_view')
# ) else:
#} return
ModelForm evt_date=forms.DateField( render(req,'events/event_form.html',{'fo
label="Event Date", rm':form})
widget=forms.DateInput(
attrs={
'type' : 'date',
'class' :'form-control date-input' urls.py
} path('AjouterEventModelform/',
)) createEventModelForm
,name="add_event2"),
organizer=forms.ModelChoiceField(queryset=Person.object
s.all(),label="Choisir un organizer")

#'list_events_view'
mawjouda fel urls.py w hiya esm
l view mte3 lista

examen1/Templates/events/event_form.html
{% block content %}
<form method="POST" action="" enctype="multipart/form-data">
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Save Data" class="btn btn-primary" />
<input type="reset" value="Cancel" class="btn btn-primary" />
</form>

{% endblock %}

form.as_p bech tnadjhemli l formulare sous forme de paragraphe


{% csrf_token %} : pour proteger le site des falsification et proteger le formulaire
http://localhost:8000/events/AjouterEventModelform/
Amdouni Mouna 4 Twin 6

● Classes
● List View
<li>
<a href="{% url 'list_events_view' %}" class="btn btn-success" >EventsViews</a>
afficher <br/>
</li>
liste des views.py events/urls.py
evenements class listEventsView(ListView):
model = Event path('eventListclass',listEvent
template_name = 'events/EventList.html' sView.as_view(),name="list
ListView context_object_name ='events'
def get_queryset(self): _events_view "),
return Event.objects.filter(state=True)

examen1/Templates/events/EventList.html

{% block content %}
<div>
<div class="d-flex m-5 flex-wrap">
{% for e in events %}

<div class="card mx-5" style="width: 18rem">


<img src="{{ e.image.url }}" class="card-img-top" alt="..." />

<div class="card-body">
<h5 class="card-title">{{e.title}}</h5>

<p class="card-text">{{e.Description}}</p>
<p class="card-text">{{e.nbe_participant}}</p>

</div>
<div class="card-footer">
<small class="text-muted">{{e.evt_date}}</small>
</div>
</div>

{% endfor %}
</div>
</div>
{% endblock content %}

http://localhost:8000/events/eventListclass
Amdouni Mouna 4 Twin 6

● Ajouter View (le ngeri lee get lee post juste na3tyha l model)
<li><a href="{% url 'add_event2' %}" class="btn btn-success" >Add EventView</a> <br/></li>

ajouter Un events/forms.py # nasna3ha manuellement events/views.py


evenement class
class createEvent(CreateView): #CreateView est une
EventModelForm(forms.ModelForm):
classe générique Django qui fournit une vue pour
class Meta:
créer un nouvel objet dans une base de données.
b View model=Event
model=Event # spécifier le modèle
template_name='events/createEvent.html'
automatiqu fields=['title','Description','image','nbe_partici
pant','evt_date','organizer']
form_class=EventModelForm #spécifier la classe
e exclude=('state',)
de formulaire associée à la vue.
success_url=reverse_lazy('list_events_view'
# widgets = {
# 'evt_date': forms.DateInput(
# attrs={ ) #spécifier l'URL de redirection après la création
# 'type': 'date', réussie de l'objet Event
# 'class': 'form-control date-input',
# 'label': 'Tapez la date de
ModelForm l\'événement',
# }
# ) urls.py
#} path('AjouterEventModelform/',
evt_date=forms.DateField( createEventModelForm
label="Event Date",
,name="add_event2"),
widget=forms.DateInput(
attrs={
'type' : 'date',
'class' :'form-control date-input'
}
)) #'list_events_view' mawjouda fel
urls.py w hiya esm l view mte3 lista
organizer=forms.ModelChoiceField(queryset=
Person.objects.all(),label="Choisir un
organizer")

examen1/Templates/events/event_form.html
{% block content %}
<form method="POST" action="" enctype="multipart/form-data">
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Save Data" class="btn btn-primary" />
<input type="reset" value="Cancel" class="btn btn-primary" />
</form>

{% endblock %}

form.as_p bech tnadjhemli l formulare sous forme de paragraphe


{% csrf_token %} : pour proteger le site des falsification et proteger le formulaire
http://localhost:8000/events/AjouterEventModelform/
Amdouni Mouna 4 Twin 6

● Details View (le ngeri lee get lee post juste na3tyha l model)
<a href="{% url 'detailEventview' e.id %}" class="btn btn-success">Details</a>

Details events/views.py
event
class detailEventview(DetailView):
model = Event
template_name='events/detail_event_view.html'
b View context_object_name="event"
automatique

urls.py
path('detailEventview/<int:pk>',detailEventview.as_view(),name="detailEventview
ModelForm "),

#' list_events_view' mawjouda fel urls.py w hiya esm l view mte3 lista

examen1/Templates/events/detail_event_view.html
{% extends 'base.html' %}
{% block content %}
<h1> event num {{event.id}}</h1>

<h2> {{event.title}} </h2>


<a href="{% url 'list_events_view' %}" class="btn btn-success"
>Events</a>
{% endblock content %}

http://localhost:8000/events/detailEventview/1
Amdouni Mouna 4 Twin 6

update View event


<a href="{% url ' updateEventView' e.id %}" class="btn btn-success" >Update</a>

Update events/forms.py # nasna3ha manuellement


class
class updateEventView(UpdateView):
model=Event # spécifier le modèle
Event EventModelForm(forms.ModelForm): template_name='events/event_form.html'
class Meta: form_class=EventModelForm
model=Event #spécifier la classe de formulaire associée à la
b View fields=['title','Description','image','nbe_participant','e
vue.

automatique vt_date','organizer']
success_url=reverse_lazy( 'list_events_
exclude=('state',)
# widgets = { view') #spécifier l'URL de redirection après
# 'evt_date': forms.DateInput( la création réussie de l'objet Event
# attrs={
# 'type': 'date',
# 'class': 'form-control date-input', urls.py
ModelForm # 'label': 'Tapez la date de l\'événement', path('updateEventView/<int:pk>',
# }
# ) updateEventView.as_view(),name
#} ="updateEventView"),
evt_date=forms.DateField(
label="Event Date",
widget=forms.DateInput(
attrs={
'type' : 'date', #'list_events_view' mawjouda fel
'class' :'form-control date-input' urls.py w hiya esm l view mte3 lista
}
))

organizer=forms.ModelChoiceField(queryset=Person.
objects.all(),label="Choisir un organizer")

http://localhost:8000/events/updateEventView/1
Amdouni Mouna 4 Twin 6

DeleteView event
<a href="{% url 'deleteEventView' e.id %}" class="btn btn-success">Delete</a>

DeleteEvent views.py
class deleteEventView(DeleteView):
model=Event
context_object_name="event"
b View template_name = 'events/delete_event_view.html'
automatique success_url=reverse_lazy('list_events_view')

urls.py
path('deleteEventView/<int:pk>',deleteEventView.as_view(),name="deleteEve
ntView"),
ModelForm

#'list_events_view' mawjouda fel urls.py w hiya esm l view mte3 lista

examen1/Templates/events/delete_event_view.html
{% extends "base.html" %}

{% block content %}
<h1>Delete Event</h1>
<p>Are you sure you want to delete {{ event.title }}?</p>
<form method="post">
{% csrf_token %}
<input type="submit" value="Delete">
<a href="{% url 'list_events_view' %}">Cancel</a>
</form>
{% endblock %}

http://localhost:8000/events/deleteEventView/7
Amdouni Mouna 4 Twin 6

Login /Logout 🙂
users/views.py users/urls.py
from django.shortcuts import render
from django.shortcuts import render
from .forms import LoginForm ,RegisterForm from .views import *
from django.shortcuts import redirect from django.urls import path
from django.contrib.auth import authenticate from django.contrib.auth.views import
,login LogoutView
# Create your views here. urlpatterns = [
def signIn(req): path('login/',signIn , name="login"),
path('register/',signUp, name="register"),
form = LoginForm() path('logout/',LogoutView.as_view(),
if req.method=="GET": name="logout")
return ]
render(req,"users/form.html",{'form':
form})
if req.method =="POST":
username= req.POST['username']
pwd =req.POST['password']
user =
authenticate(req,username=username,pa
ssword=pwd)
if user is not None:
login(request=req,user=user)
return redirect('list_events_view')
else :
return
render(req,"users/form.html",{
"error":"invalid
credentials","form":form })

def signUp(req):
form =RegisterForm()
if req.method=="POST":
form=RegisterForm(req.POST)
print(req.POST)
if form.is_valid():
user=form.save()
login(req,user=user)
return redirect('list_events_view')
return
render(req,"users/form.html",{"form":f
orm})
Amdouni Mouna 4 Twin 6

forms.py Templates/users/form.html
from django import forms
from users.models import Person
from django.contrib.auth.forms import {% extends 'base.html' %}
UserCreationForm {% block content %}
from django.contrib.auth import get_user_model
<form method="POST" action="">
{% csrf_token %}
class LoginForm(forms.ModelForm): {{form.as_p}}
<input type="submit" value="Login"
class Meta: class="btn btn-primary" />
model=Person </form>
fields=['username','password'] {% endblock %}
password
=forms.CharField(label="Password",wid
get=forms.PasswordInput())

class RegisterForm(UserCreationForm):
class Meta:
model= get_user_model()

fields=['cin','username','email','first_nam
e',

'last_name','password1','password2']
def save(self, commit=True):
return
super(RegisterForm,self).save(commit)

Securiser Les Paths

@login_required(login_url="login" @login_required
)
def createEventModelForm(req): def createEventModelForm(req):
if req.method=='GET': if req.method=='GET':
form=EventModelForm() form=EventModelForm()
return return
render(req,'events/event_form.html',{'form':form render(req,'events/event_form.html',{'form':form
}) })
if req.method == 'POST': if req.method == 'POST':
form=EventModelForm(req.POST, form=EventModelForm(req.POST,
req.FILES) req.FILES)
if form.is_valid(): if form.is_valid():
Event=form.save(commit=False) Event=form.save(commit=False)
Event.save() Event.save()
return redirect('list_events_view') return redirect('list_events_view')
else: else:
return return
Amdouni Mouna 4 Twin 6

render(req,'events/event_form.html',{'form':form render(req,'events/event_form.html',{'form':form
}) })

jawha behy w ken aandi l houni tjini erreur


view login traja3ni lel
login

rest api
apres la creation soit d’un dossier api soit d’une
application nommée api ajouter les 3 fichiers:

NB: menansech nzid fi west urls.py lekbira


path('api/',include("api.urls"))

views.py Serializers.py urls.py


from django.shortcuts import render from rest_framework import from django.urls import path
from rest_framework.response import serializers from .views import *
Response from events.models import Event urlpatterns = [
from rest_framework import status # fonction
from rest_framework.decorators import class path('',getEvents,name='getEvents'),
api_view EventSerializer(serializers.ModelSerial
from rest_framework import serializers izer): path('add',addEvent,name='addEvent'),
from events.models import Event class Meta:
from .Serializers import EventSerializer model = Event path('update/<int:id>',updateEvent,na
@api_view(['GET']) fields = '__all__' # bech njib les me='updateEvent'),
def getEvents(req): champs lkolmte3 l model Event
events=Event.objects.all() path('delete/<int:id>',deleteEvent,name
='deleteEvent'),
serializer=EventSerializer(events,many=True)
return
Response(serializer.data,status=status.HTTP_2
00_OK)
Amdouni Mouna 4 Twin 6

# Create your views here.


@api_view(['POST'])
def addEvent(req):
serializer=EventSerializer(data=req.data) ]
if serializer.is_valid():
serializer.save()
return
Response(serializer.data,status=status.HTTP_2
01_CREATED)
return
Response(serializer.errors,status=status.HTTP
_400_BAD_REQUEST)
@api_view(['GET','PUT'])
def updateEvent(req, id=None):
event=Event.objects.get(id=id)

serializer=EventSerializer(instance=event,data
=req.data)
if serializer.is_valid():
serializer.save()
return
Response(serializer.data,status=status.HTTP_2
01_CREATED)
return
Response(serializer.errors,status=status.HTTP
_400_BAD_REQUEST)
@api_view(['GET','DELETE'])
def deleteEvent(req,id=None):
try:
event=Event.objects.get(id=id)
except Event.DoesNotExist:
return Response(status="Event not
found")
event.delete
return Response("Event deleted")

Unindent does not match any outer indentation level⇒


nthabbet fel espace khater python hedha

fama for.as_ul kif fel examen 3IA


Amdouni Mouna 4 Twin 6

lezemni nhouf f nafs l’examen fazet l jomla illi todhher


kif aura lieu wwww

You might also like