You are on page 1of 3

pip3 install pipenv

mkdir proj
cd proj
pipenv install django==2.1
pipenv shell
django-admin startproject proj .
./manage.py runserver http://127.0.0.1:8000/
python manage.py startapp app
add the app to NSTALLED_APPS settings.py project level
URL -> View -> Model (typically) -> Template
edit the settings.py TEMPLATES = 'DIRS':[os.path.join(BASE_DIR, 'templates')]

class based views: django.views.generic: TemplateView. template_name='...html'


(ListView) model=Post tempname... {% for post in object_list %}...
(DetailView) model=Post tmpname... {{object}}

url: PageView.as_view(). path('post/<int:pk>/edit') ds tp:{% url 'name' object.pk %}

template: <bal>{block}...{endblock}</bal> {% extends 'base.html' %}


logique ds le template: <a href="{%url 'nom_url'%}">...</a>
dossier static. avec des sous dossiers css, js et autres ..

settings.py: STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

dans le template: {% load static %} <link href="{% static 'css/base.css' %}"..>


model: django.db import models (models.Model) models.TextField() ... def __str__():
def get_absolute_url(): return reverse('url_name', [option si])
author = models.ForeignKey('auth.User', on_delete=models.CASCADE) curent admin user
puis makemigrations app, migrate, createsuperuser, mod.objects.all, .get/filter(pk=)
admin: admin.site.register(model)

forms: django.views.generic.edit CreateView, UpdateView, DeleteView


ds delte: succes_url=reverse_lazy('home'). ds create: fields='__all__'
template: <form method='POST'> {csrf_token} {{form.as_p}} <button>...</> </form>

TESTS

django users: url: path('chemin/', include('django.contrib.auth.urls')) 'login', 'logout'


instide templates, create folder 'registration' for tmps login.html,logout,pasw...
login.html: just a form.as_p. ds settins.py LOGIN_REDIRECT_URL = 'home'
{%if user.is_authenticated%}...{%endif%}
in settings.py LOGOUT_REDIRECT_URL = 'home'
signup: django.contrib.auth.forms UserCreationForm. username, pass1 and pass2
new app for signup. veiw(django.generic.CreateView) form_class=UserCreationForm
success_url=reverse_lazy('login') template_name='signup.html'
pour le template, juste un form.
LoginView
SignupView: django.contrib.auth.forms (from_class=UserCreationForm), UserChangeForm
(generic.CreateView) temp_nam='signup.html' succes_url(reverse_lazy('login'))
django.contrib.auth.models class CustunUser(AbstractUser)
age=models.PositiveIntegerField(null=True, blank=True) fields...
forms.py from django import forms import UserCreationForm, UserChaneForm
class CustomUserCreationFrom(UCrF): class Meta(UCF.Meta): model=CostumUser fields=()
class CustomUserChangeFrom(UChF): class Meta(UChF.Meta): model=CostumUser fields=()
fieds=('username', 'email', 'age') on vera ds le formulaire signup + pass...
ds la vue, SignUpView(gen.CreateView) form_class = CustomUserCreationForm

Boostrap. 4files. Bootstrap.css, jQuery.js, Popper.js, Bootstrap.js


ds head le premier link, <link ...bootstrap.css...>
avant de fermer body : JQuery puis Popper et enfin Bootstrap <script src=".."></sr>

install crispy_forms; add to INSTALLED_APPS[]; CRISPY_TEMPLATE_PACK = 'bootstrap4'


in signup.html after extends base {% load crispy_forms_tags %}
{{form|crispy}} <button class="btn btn-success" type="submit">Sign Up</button>

in registation folder: /password_change_form.html and /password_change_done.html


just simple forms and a simple infos message .
password reset. in settings, EMAIL_BACKEND = for the email system.
in reg folder: password_reset_form.html(form email @ to send mail),
password_reset_done.html(message to check the mail inbox), password_reset_confirm.html(form to
enter new pass)
password_reset_complete.html(message done and link to login)

Email. SendGrid SMTP Relay. create API Key


configure the EMAIL_BACKEND
so the mail will be sent to your email address.
Bug: webmaster@email not verified.

Custon emails. in reg folder password_reset_email.html rwitte your text.

AUTH_USER_MODEL = 'users.CustumUser' app users et model CustumUser


now the app. django.contrib.auth get_user_model author=FK(get_user_model(), ..)
def get_absolute_url(self): return reverse('artdetl', args=[str(self.id)])

Permission and Authorization


the creator is the author. remove author from the fields to type and
def form_valid(self, form):
form.instance.author = self.request.user return super().form_valid(form)

pour exiger qune action soit faite par un user connecte, LoginRequired mixin
django.contrib.auth.mixins (LoginRequiredMixin)
class ArticleCreateView(LoginRequiredMixin, CreateView)
... login_url='login' # automatiquemt redirige au login dabord.
pour Create, List, Detail, Delete, Update

update et delete uniquement par le author proprio


from django.core.exceptions import PernissionDenied
def dispatch(self, request, *args, **kwargs):
obj=self.get_object();
if obj.author != self.request.user: raise PermissionDenied
return super().dispatch(request,*args, **kwargs)

Comment model. in admin, TabularInline or StackedInline


in the comment model, add related_name='coments'

heroku run python manage.py migrate


heroku run bash
heroku apps:rename learning-log

https://www.youtube.com/watch?v=gGt_9ELa6yo first job

search: path('', include('pages.urls', namespace??))


dans la vue: fields=['','']update or fields=('','')
django.views.generic.edit.CreateView
django.views.generic.CreateView (for signup form)

migrations de BD, deploiement sur heroku, authentification et authorisation


admin management

You might also like