Django中的类视图

Django view points to a function, which can be a problem if you want to change only a bit of functionality. Yes, I could have million keyword arguments and even more if statements in the function, but I was thinking more of an object oriented approach.

例如,我有一个显示用户的页面。该页面与显示组的页面非常相似,但与仅使用其他数据模型不太相似。集团也有会员等...

一种方法是将视图指向类方法,然后扩展该类。有没有人尝试过这种方法或有任何其他想法?

0
当然,谢谢Alex。我忘记了一些。 :-)
额外 作者 engtech,
@ George2:您能否回顾您的旧问题并检查是否有应该标记为已回答的问题?如果你还没有收到你想要的答案,请编辑并澄清你的问题。谢谢!!
额外 作者 Alex Angas,

10 答案

我已经玩了一些,并在过去发现了一些有用的文件。

看看它上面的机器人论坛

基本上在机器人上运行'家庭'作业,您需要每个轴的绝对位置,这可以在控制器内部的贴纸上找到。 在首页你应该有所有的参考箭头进行排列。

如果原位丢失,编码器内存将丢失。它每次革命计数4000点 - 如果编码器memoery丢失,它不知道有多少人通过。

把新编码器和旧编码器的位置之间的差异除以4000--这会给你多少出来的。

给出的例子是:

原始主编码器计数:-119771新的主编码器计数(排列参考标记并设置该轴的数据后):-95834差值:-23937除以4000:5.98425因此,转出的次数是6我的新归位应该然后是-119771 +(6)x(4000)= -95771

4
额外

查看内容查询Web部件。

3
额外
对不起,在会议的途中很匆忙! thx kusek
额外 作者 Anonymous User,
@George你可能需要为此打开一个新问题。但是我会在这里给你提供内容查询Web部件的答案。 blogs.msdn.com/ecm/archive/2006/10/25/…
额外 作者 Isaac Moses,
谢谢安德斯!您能否告诉我更多关于如何使用“内容查询Web部件”创建可在父站点和子站点上显示的列表(以显示相同内容)的更多信息?
额外 作者 engtech,

通用视图通常是要走的路,但最终您可以自由处理所需的URL。 FormWizard以基于类的方式执行某些操作,就像使用RESTful API的某些应用程序一样。

基本上用一个URL给你一大堆变量,并提供一个可调用的地方,你提供的可调用完全取决于你 - 标准的方法是提供一个函数 - 但是最终Django对你的工作没有限制。

我同意,如何做到这一点的更多例子会很好,FormWizard可能是最好的开始。

0
额外

我创建并使用了自己的通用视图类,定义了 __ call __ ,以便可以调用该类的实例。我很喜欢;虽然Django的泛型视图允许通过关键字参数进行一些定制,但是OO泛型视图(如果它们的行为被拆分成多个单独的方法)可以通过子类化进行更细粒度的自定义,这让我可以更少地重复自己。 (我厌倦了随时重写相同的创建/更新视图逻辑,因为我需要调整Django的通用视图不允许的东西)。

我在 djangosnippets.org 上发布了一些代码。

我看到唯一真正的缺点是内部方法调用的泛滥,这可能会影响性能。我认为这不是一个大问题; Python代码执行很少会成为Web应用程序中的性能瓶颈。

UPDATE: Django's own generic views are now class-based.

UPDATE: FWIW, I've changed my opinion on class-based views since this answer was written. After having used them extensively on a couple of projects, I feel they tend to lead to code that is satisfyingly DRY to write, but very hard to read and maintain later, because functionality is spread across so many different places, and subclasses are so dependent on every implementation detail of the superclasses and mixins. I now feel that TemplateResponse and view decorators is a better answer for decomposing view code.

0
额外
Python执行不是瓶颈,但可能会影响网站的可伸缩性和整体性能。我很高兴memcache存在!
额外 作者 StefanNch,

如果你想分享页面间的通用功能,我建议你看看自定义标签。他们很易于创建,而且非常强大。

此外,模板可以从其他模板扩展。这使您可以拥有一个基本模板来设置页面的布局,并在填充空白的其他模板之间共享该模板。您可以将模板嵌套到任何深度;允许您在单独的一组相关页面上指定布局。

0
额外
我不认为在模板中放置太多的逻辑是一个好主意。
额外 作者 Attila O.,

除非你想做一些有点复杂的事情,否则使用通用视图是一种方法。它们比它们的名字所暗示的功能强大得多,如果你只是显示模型数据,通用视图将完成这项工作。

0
额外

如果您只是显示模型中的数据,为什么不使用 Django Generic Views 的?它们旨在让您轻松显示模型中的数据,而无需编写自己的视图,以及将URL参数映射到视图,获取数据,处理边缘案例和渲染输出等内容。

0
额外

您始终可以创建一个类,重写 __ call __ 函数,然后将该URL文件指向该类的一个实例。您可以查看 FormWizard 上课,看看这是如何完成的。

0
额外
标记处理器吃了你的__。使用\ _隐藏标记。类__call__方法就是所谓的。问题是要确保urls.py具有可用的类的实例。它使你的urls.py更复杂一些。
额外 作者 S.Lott,

我需要使用基于类的视图,但我希望能够在URLconf中使用类的全名,而不必在使用视图类之前实例化视图类。帮助我的是一个令人惊讶的简单元类:

class CallableViewClass(type):
    def __call__(cls, *args, **kwargs):
        if args and isinstance(args[0], HttpRequest):
            instance = super(CallableViewClass, cls).__call__()
            return instance.__call__(*args, **kwargs)
        else:
            instance = super(CallableViewClass, cls).__call__(*args, **kwargs)
            return instance


class View(object):
    __metaclass__ = CallableViewClass

    def __call__(self, request, *args, **kwargs):
        if hasattr(self, request.method):
            handler = getattr(self, request.method)
            if hasattr(handler, '__call__'):
                return handler(request, *args, **kwargs)
        return HttpResponseBadRequest('Method Not Allowed', status=405)

我现在既可以实例化视图类和使用情况的视图功能,或者我可以简单地指向我的URL配置上我的课,并有元类实例化(和调用)的视图类我。这可以通过检查 __ call __ 的第一个参数来工作。如果它是 HttpRequest ,它必须是一个实际的HTTP请求,因为使用 HttpRequest 实例尝试实例化视图类是无稽之谈。

class MyView(View):
    def __init__(self, arg=None):
        self.arg = arg
    def GET(request):
        return HttpResponse(self.arg or 'no args provided')

@login_required
class MyOtherView(View):
    def POST(request):
        pass

# And all the following work as expected.
urlpatterns = patterns(''
    url(r'^myview1$', 'myapp.views.MyView', name='myview1'),
    url(r'^myview2$', myapp.views.MyView, name='myview2'),
    url(r'^myview3$', myapp.views.MyView('foobar'), name='myview3'),
    url(r'^myotherview$', 'myapp.views.MyOtherView', name='otherview'),
)

(我在 http://djangosnippets.org/snippets/2041/ 发布了一段代码)

0
额外
完全真棒
额外 作者 Anentropic,

你可以使用Django通用视图。您可以通过Django通用视图轻松实现所需的功能

0
额外