获取基于类视图的URL的最佳方法是什么?

时间:2015-08-13 15:36:21

标签: django django-views

我的urls.py

url(r'^foo/$', FooView.as_view(),  name='foo-view'),        
url(r'^bar1/$', BarView.as_view(),  name='bar-one-view'),
url(r'^bar2/$', BarView.as_view(),  name='bar-two-view'),                   

现在我想知道,哪些名字被连接到CBV-Class(或函数),所以我可以这样做:

how_to_do_this(BarView.as_view)

应返回[' bar-one-view',' bar-two-view']

2 个答案:

答案 0 :(得分:0)

我的问题:URLconf通常使用类似urlpatterns的变量定义,该变量是类RegexURLPattern的对象列表。这个类的一个成员是callback方法。您需要将urlpatterns导入到脚本中,然后遍历所有RegexURLPattern个对象,直到获得与可调用对象(CBV或FBV)的匹配,之后您可以检查name成员(假设它是在URLconf中定义的)。这应该给你视图的名称。

但是,正如我所说,我想不出你为什么要这样做。; - )

答案 1 :(得分:0)

这就是它现在对我有用的方式。也许有一个更好的?

一个mixin,为视图函数提供一个自定义装饰器,用于存储模块和类:

public ActionResult NewCourseTitle()
{
    ViewBag.Type = new SelectList(db.CourseTypes, "CourseTypeID", "Type");
    return View();
}

//
//Post:

[HttpPost]
public ActionResult NewCourseTitle(CourseTitle courseTitle)
{
    if (ModelState.IsValid)
    {
        db.CourseTitles.AddObject(courseTitle);
        db.SaveChanges();
        return RedirectToAction("Create", "Course");
    }
    return View();
}

所以当app / dir / whatever / views.py中的CBV有这个混合时......

class SignatureMixin(object):
   @classmethod
   view_func = super(SignatureMixin, cls).as_view(**initkwargs)
      signature = "%s.%s" % (inspect.getmodule(cls).__name__, cls.__name__ )        
      view_func.__signature__  = signature
      return view_func

...我可以通过urls.urlpatterns递归回调的条目:

class SomeView(SignatureMixin,View):
    ...