Novidades do Django 5.1
Last updated
# core/views.py
from django.shortcuts import render
from django.contrib.auth.decorators import login_not_required
@login_not_required
def index(request):
return render(request, 'index.html')
@login_not_required
def about(request):
return render(request, 'about.html')
def profile(request):
return render(request, 'profile.html')# urls.py
from django.contrib.auth.views import LoginView, LogoutView
from django.contrib import admin
from django.urls import path
from backend.core import views as v
urlpatterns = [
path('', v.index, name='index'),
path('about/', v.about, name='about'),
path('accounts/profile/', v.profile, name='profile'),
path(
'accounts/login/',
LoginView.as_view(template_name='login.html'),
name='login'
),
path('logout/', LogoutView.as_view(), name='logout'),
path('admin/', admin.site.urls),
]# settings.py
MIDDLEWARE = [
...
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.LoginRequiredMiddleware', # <---
...
]
LOGOUT_REDIRECT_URL = 'index'cd backend
python ../manage.py startapp crmcd ..
python manage.py create_command core -n create_datadef get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context['page'] = self.request.GET.get('page', 1)
return context<p>{{ page }} é a página definida pela variável page.</p>
<p>{{ page.next_page_number }} page.next_page_number não existe.</p><a href="{\% querystring page=page|add:-1 %}">Previous page is {{ page|add:-1 }}</a>
<a href="{\% querystring page=page|add:1 %}">Next page is {{ page|add:1 }}</a>http://localhost:8000/person/?search=ahttp://localhost:8000/person/?search=a&page=1 def get_queryset(self):
queryset = super().get_queryset()
search = self.request.GET.get('search')
if search:
queryset = queryset.filter(
Q(first_name__icontains=search)
| Q(last_name__icontains=search)
| Q(email__icontains=search)
)
return queryset<a href="?{\% if request.GET.search %}search={{ request.GET.search }}{\% endif %}&page={{ pg }}"><nav aria-label="Pagination">
<ul class="pagination">
{\% if page_obj.has_previous %}
<li><a href="{\% querystring page=1 %}">«</a></li>
<li><a href="{\% querystring page=page_obj.previous_page_number %}">‹</a></li>
{\% endif %}
{\% for pg in page_obj.paginator.page_range %}
{\% if pg <= 3 or pg >= page_obj.paginator.num_pages|add:'-2' %}
<li class="{\% if page_obj.number == pg %}active{\% endif %}">
<a href="{\% querystring page=pg %}">{{ pg }}</a>
</li>
{\% elif pg >= page_obj.number|add:'-3' and pg <= page_obj.number|add:'3' %}
<li class="{\% if page_obj.number == pg %}active{\% endif %}">
<a href="{\% querystring page=pg %}">{{ pg }}</a>
</li>
{\% elif pg == page_obj.number|add:'-4' or pg == page_obj.number|add:'4' %}
<li><a href="#">...</a></li>
{\% endif %}
{\% endfor %}
{\% if page_obj.has_next %}
<li><a href="{\% querystring page=page_obj.next_page_number %}">›</a></li>
<li><a href="{\% querystring page=page_obj.paginator.num_pages %}">»</a></li>
{\% endif %}
</ul>
</nav>@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ('__str__', 'category__title', 'category__type')File "~/.venv/lib/python3.12/site-packages/django/core/management/base.py", line 563, in check
raise SystemCheckError(msg)
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:
ERRORS:
<class 'backend.core.admin.ProductAdmin'>: (admin.E108) The value of 'list_display[1]' refers to 'category__title', which is not a callable, an attribute of 'ProductAdmin', or an attribute or method on 'core.Product'.