Как определить значение по умолчанию для параметров urls в Django?

views.py
from django.views.generic import ListView
from .models import Staff

class StaffListView(ListView):
    model = Staff
    template_name = 'staff/staff_list.html'

    def get_queryset(self):
        return Staff.objects.filter(websites__path=self.kwargs['web'])
urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path('<str:web>/staff/', include('staff.urls')),
    # I want to set web=chemical, if url is http://127.0.0.1:8000/staff
]

С помощью Django URL вы не сможете этого сделать. Но у меня есть обманный способ. Вы можете использовать middlewares > Проверить URL, если это URL, проверенный с пустым параметром > перенаправить его на правильный URL.

Образец:

def redirect_middleware(get_response):
    def middleware(request, *args, **kwargs):
        # In here I write a sample with a basic check, you can use regex to check.
        if request.path == "/staff": 
            return redirect('/chemical/staff')
        response = get_response(request, *args, **kwargs)
        return response
    return middleware

Простым решением является использование RedirectView ?

urlpatterns = [
    path('admin/', admin.site.urls),
    path('<str:web>/staff/', include('staff.urls')),
    path('staff', StaffRedirectView.as_view()),
]

# in views
from django.views.generic.base import RedirectView


class StaffRedirectView(RedirectView):

    def get_redirect_url(self, *args, **kwargs):
        return "/chemical" + self.request.get_full_path()

Я думаю, эта идея может подойти для вашего случая

urlpatterns = [
    path('admin/', admin.site.urls),
    path('staff/', include('staff.urls'),kwargs={'web':''}),
    path('<str:web>/staff/', include('staff.urls')),
]
staff.urls.py
urlpatterns = [
    path('',views.StaffListView.as_view())
]
Вернуться на верх