Django:如何使用DRY原理覆盖第三方视图



我已经为我计划使用这个第三方应用程序扩展的功能创建了一个单独的应用程序,我不打算接触它的代码。

我要扩展的视图,发布问题或获取用户提问的表单。我想用这个观点发表一篇文章。它使用的形式不同。

下面的Psuedo代码:

post_question_view(request)
    If user is authenticated and read only, redirect somewhere else.
    form = form.Askquestionform(request.REQUEST) ( I would like to do form = form.AskArticleform())
    If the request is post and form is valid, get clean data. (The article will include additional data)
    If user is authenticated, draft a question and write the question to the database. Generate a new-question-posted signal and redirect. (I don't have to make any changes here I guess)
    If user is not authenticated, create anonymous question, write it to the database and redirect to the login page. 
    If the request is get fill in the form intial and render to ask_question.html (I would like to render to ask_article.html)

大部分代码都有一些需要做的小改动。我需要填补一些空白,并在现有代码中添加一些新的空白。如何使用干弹簧夹完成此操作?

  1. 我应该为这两个函数创建一个包装器,并根据请求调用合适的包装器吗
  2. 可以使用装饰器吗?表单将包含新的字段,因此如果不修改当前视图,我认为这是不可能的
  3. 或者,除了将此视图复制到我的应用程序并进行修改之外,没有其他方法吗

我将根据您的伪代码回答您的三个问题,即post_question_view是一个没有参数的老式(非基于类的)Django视图:

  1. 不,如果两个视图重复代码,那么创建一个调用这两个视图之一的包装器就不是DRY。这只是将重复的代码隐藏在包装器后面。

  2. 不,如果post_question_view没有任何参数来修改它的行为,比如使用不同的形式,decorator就没有帮助。

  3. 没有。视图的编写方式不允许进行这些修改。在一个had上,它没有以你想要的方式改变其行为的参数——如果它改变了,你可以使用这些参数。另一方面,它不是一个基于类的视图,它的功能被组织成可重写的字段和方法——如果是这样,你可以对视图进行子类化,并重写适当的字段和方式。

有一个例外,我所说的是基于技术性的。您可以在运行时使用Python的inspect模块在代码中获取原始视图的源代码,然后在运行时在文本级别上对代码进行实际修改,再在运行时对代码进行评估以创建新视图。从技术上讲,这将是DRY,因为你不会在源代码中重复自己,但这根本不是人们所说的DRY的意思,因为这是一个可爱的技巧,而不是使用健全的代码组织和架构来避免源代码重复。

最新更新