Django Advanced
Django Advanced
CustomTags
register = template.Library()
@register.simple_tag()
def has_profile():
return Profile.objects.count() > 0
Dates
TemplateView
class LandingPageView(TemplateView):
# required:
template_name = 'landing_page.html'
# optional:
def get_context_data(self):
context = super(LandingPageView, self).get_context_data()
context.update({
'title': 'Django landing page',
'data': 'Django context data',
})
return context
Generic Views
from django.views.generic
ListView
class TodoslistView(ListView):
# required:
model = Todo
template_name = 'todos/todos_list.html'
# Optional
# context_object_name = "posts" (default: post_list)
# queryset = Todo.objects.all()
DetailView
class TodoDetailsView(DetailView):
# required:
model = Todo
template_name = 'todos/todos_detail.html'
# optional:
# context_object_name = "todo_task" (default: todo / object)
CRUD Views
from django.views.generic
/ basic /
CreateView (вкл. за Регистрация на потребител)
class TodoCreateView(CreateView):
# required:
model = Todo
success_url = reverse_lazy(‘todos list’)
form_class = UserCreateForm # за Регистрация на потр.
# one of these:
template_name = ‘todos/create_view.html’
fields = ‘__all__’
/ relation /
class CreatePetView(views.CreateView):
form_class = PetCreateForm
template_name = 'pets/pet-add-page.html'
def get_success_url(self):
return reverse_lazy("details user", {
'pk': self.request.user.id,
})
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
class PetBaseForm(forms.ModelForm):
def __init__(self, user, *args, **kwargs):
super().__init__(*args, **kwargs)
self.user = user
class CreatePhotoView(auth_mixins.LoginRequiredMixin,
views.CreateView):
model = Photo
template_name = 'photos/photo-add-page.html'
fields = ('photo', 'description', 'location', )
def get_success_url(self):
return reverse_lazy('details photo', kwargs={
'pk': self.object.id
})
- - - -
UpdateView
class TodoUpdateView(UpdateView):
# required:
model = Todo
success_url = reverse_lazy(‘todos list’)
# one of these:
template_name = ‘todos/update_view.html’
fields = ‘__all__’
DeleteView
class TodoDeleteView(DeleteView):
# required:
model = Todo
success_url = reverse_lazy(‘todos list’)
# one of these:
template_name = ‘todos/delete_view.html’
fields = ‘__all__’
URL Configuration
path('accounts/', include('django.contrib.auth.urls')),
Authentication Forms
Импортират се от
from django.contrib.auth import forms as auth_forms
Видове:
● за Регистрация
● за Вход
UserCreationForm - за регистрация
class PetstagramUserCreateForm(auth_forms.UserCreationForm):
password1 = forms.CharField(
widget=forms.PasswordInput(
attrs={
"autocomplete": "new-password",
"placeholder": "Password1"
}),
)
password2 = forms.CharField(
widget=forms.PasswordInput(
attrs={
"autocomplete": "new-password",
"placeholder": "Password2"
}),
)
class Meta(auth_forms.UserCreationForm.Meta):
model = PetstagramUser
fields = ('username', 'email')
widgets = {
'username': forms.TextInput(
attrs={
'placeholder': 'Username',
}
),
'email': forms.EmailInput(
attrs={
'placeholder': 'Email'
}
),
}
AuthenticationForm - за вход
class UserLoginForm(auth_forms.AuthenticationForm):
username = auth_forms.UsernameField(
widget=forms.TextInput(
attrs={
"autofocus": True,
"placeholder": "Username",
})
)
password = forms.CharField(
strip=False,
widget=forms.PasswordInput(
attrs={
"autocomplete": "current-password",
"placeholder": "Password"
}
),
)
Authentication Views
ID на текущия потребител (във View): self.request.user.id
ID на текущия потребител (в Template): user.id
!!!
За да достъпи даденото View, потребителят трябва да е логнат
!!!
class CreatePetView(auth_mixins.LoginRequiredMixin,
views.CreateView):
pass
LoginView
class CustomLoginView(auth_views.LoginView):
template_name = 'accounts/login.html'
form_class = UserLoginForm
next_page = reverse_lazy(‘index’)
LogoutView
class UserLogoutView(auth_views.LogoutView):
form_class = UserLogoutForm
next_page = reverse_lazy('login user')
PasswordChangeView
class UserLogoutView(auth_views.PasswordChangeView):
template_name = 'accounts/change-password.html'
path('password_change_done/',
RedirectView.as_view(url=reverse_lazy('index')),
name='password_change_done'),