【问题标题】:How do I redirect a url using DetailView class in Django?如何在 Django 中使用 DetailView 类重定向 url?
【发布时间】:2012-04-09 11:04:47
【问题描述】:

在我决定使用DetailView 之前,我有一个使用this solution 的url 重定向。

现在我使用DetailView 如何实现相同的重定向? name 必须相同,因为我在 settings.py 中使用 LOGIN_REDIRECT_URL

这是urls.py 的一部分

urlpatterns = patterns( 'doors.views',
    url(
        r'^users/$',
        ListView.as_view(
            model = User,
            template_name = 'doors/users/list.html'
        ),
    ),
    url(
        r'^users/(?P<pk>\d+)/$',
        DetailView.as_view(
            model = User,
            template_name = 'doors/users/detail.html'
        ),
        name = 'users_detail'
    ),
    url( r'^users/self/$', # do some kind of redirect 'users_self_detail', name = 'users_self_detail' ),
)

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    这是在 Django 2 中执行此操作的 2 种方法。 您可以在

    中创建视图并定义模板路径

    1) 创建 在 url 文件中查看 并在那里定义路径

    from django.urls import  path
    from django.views.generic import ListView, DetailView
    from crm.models import Organisation
    
    urlpatterns = [
        path('org/<int:pk>', DetailView.as_view(model=Organisation, 
    template_name = 'crm/org/org_detail_main.html'))
    

    2) 在视图中创建单独的视图并在那里定义显式模板

    所以这里是 urls

    from django.urls import include, path
    from crm.views import OrganisationDetailView
    
    urlpatterns = [
        path('org/<int:pk>',OrganisationDetailView.as_view(), 
        name='organisation_detail')
    

    以及观看次数

    from .models import Activity, Organisation
    from django.views.generic.detail import DetailView
    
    
    class OrganisationDetailView(DetailView):
    
        model = Organisation
        template_name = 'crm/org/org_detail_main.html' 
    

    【讨论】:

      【解决方案2】:

      我们不要称它为 redirecting,因为这会与 HTTP 重定向混淆。假设我们希望视图表现相同,即它们应该以相同的代码和模板结束。这是我自己继承DetailView 的地方。比如:

      class UserDetailView(DetailView):
          model = User
          template_name = 'doors/users/detail.html'
      
      class SelfUserDetailView(UserDetailView):
          def get_object(self):
             return self.request.user
      

      然后在urls.py:

      from django.contrib.auth.decorators import login_required
      from myapp.views import UserDetailView, SelfUserDetailView
      url(r'^users/(?P<pk>\d+)/$', UserDetailView.as_view(), name='users_detail'),
      url(r'^users/self/$', login_required(SelfUserDetailView.as_view()), name='users_self_detail'),
      

      【讨论】:

      • 我应该在urls.py 中继承DetailView,因为我已经在那里导入了DetailView 吗?
      • 我个人将子类放在我的应用程序views.py 中,类似于您编写自己的基于函数的视图时。否则你的urls.py 会变得很大——在我现在工作的网站上,我们有超过 100 个基于类的自定义视图。
      • @login_required 放在class SelfUserDetailView 之上怎么样?您输入urls.py 的任何特殊原因?
      • 我不确定装饰器是否已更新为适用于基于类的视图,所以我避免这样做。 (这可能只是因为我使用的是1.3之前的东西。)
      • Django 1.9 引入了LoginRequiredMixin 类,相当于 login_required 方法/函数。
      【解决方案3】:

      Check the docs out for decorating urls when using class based views

      from django.contrib.auth.decorators import login_required
      urlpatterns = patterns( 'doors.views',
          url(r'^users/$',login_required(ListView.as_view(model = User,template_name = 'doors/users/list.html')),
          ...
      ),
      

      【讨论】:

        猜你喜欢
        • 2019-10-21
        • 1970-01-01
        • 2020-02-16
        • 2018-05-18
        • 2022-11-06
        • 2011-09-21
        • 2020-06-22
        • 2018-06-04
        • 2014-10-31
        相关资源
        最近更新 更多