如何让每个后续页面都保留 URL 中的 slug 并附加 URI

问题描述 投票:0回答:0

我正在制作一个 Django 网站,其中有 2 个应用程序。一旦用户登录并导航到站点的仪表板区域,我希望他们选择一个要管理的租户,并为每个后续菜单按钮单击以位于该租户的上下文中。例如,用户登录时可以访问“tenant1”。我希望所有网址都遵循格式 http://mywebsite/tenant1/insert_uri_here.

到目前为止,我已经成功地创建了一个租户选择器页面,并通过添加 slug 从那里导航到仪表板。问题是每个后续页面都不再包含 slug,而且我不确定如何从上一页访问 slug 以便能够在 href 中访问它。即便如此,我仍然可以看到依赖于前几页 slug 的解决方案很麻烦,因为某些导航选项不需要 slug,只需要用户信息。

这是我的 URLs.py

urlpatterns = [
    path('', tenant_selector.as_view(), name='tenant_selector'),
    path('<slug:slug>/dashboard', Dashboard.as_view(), name='Dashboard'),
    path('<slug:slug>/config/', config_view.as_view()),
    path('<slug:slug>/run_func/', loading_view.as_view()),
    path('profile/', user_update_view.as_view(), name='Profile'),
    path('success', Success.as_view()),
]

下面是Views.py

class Dashboard(TemplateView):
    template_name = "dashboard.html"
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['total'] = staff_sync_model.objects.count() + student_sync_model.objects.count()
        context['staff'] = staff_sync_model.objects.count()
        context['student'] = student_sync_model.objects.count()
        return context

    
class config_view(CreateView):
    model = tenant_model
    form_class = config_form
    template_name='tenant_config.html'
    success_url='/account/success'
    def form_valid(self, form):
        obj = form.save(commit=False)
        obj.user = self.request.user
        obj.save()
        return redirect('/account/success')


class user_update_view(UpdateView):
    form_class = EditUser
    template_name='account.html'
    success_url='success'
    def form_invalid(self, form):
        return HttpResponse("form is invalid.. this is just an HttpResponse object")
    def get_object(self):
        for detail in self.request.user._meta.fields:
                print(detail)
        return self.request.user

class Success(TemplateView):
    template_name='success.html'
    
class tenant_selector(ListView):

    model = tenant_model
    template_name = 'tenant_selector.html'

    def get(self, request, *args, **kwargs):
        if self.request.user.is_authenticated:
            data = self.request.user.tenant_set.all()
            if len(data) == 0:
                # Redirect to a different URL if data is empty
                print('redirect')
                return redirect('/account/config')
        return super().get(request, *args, **kwargs)


    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        if self.request.user.is_authenticated:
            data = self.request.user.tenant_set.all()
            context['data'] = data
        return context

class loading_view(TemplateView):
    template_name='loading.html'

不太确定正确的方法是什么,我对 Django 和 Web 开发还很陌生,所以任何向正确方向的推动或使用正确的工具来达到预期结果都将不胜感激!

python django url django-views django-urls
© www.soinside.com 2019 - 2024. All rights reserved.