Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:如何使用DRY原则覆盖第三方视图?_Django_Django Views - Fatal编程技术网

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

Django:如何使用DRY原则覆盖第三方视图?,django,django-views,Django,Django Views,我已经为一个功能创建了一个单独的应用程序,我计划使用这个第三方应用程序扩展这个功能,我不打算触碰它的代码 我想要扩展的视图,发布一个问题或获取一个表单供用户提问。 我想使用此视图发布一篇文章。它使用的形式是不同的 Psuedo代码如下: post_question_view(request) If user is authenticated and read only, redirect somewhere else. form = form.Askquestionform(r

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

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

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)
大部分代码都有一些小的改动需要完成。我需要填补一些空白,并在现有代码中添加一些新的空白。 我如何使用干燥的Principle进行此操作

  • 我是否应该为这两个函数创建一个包装器,并根据请求调用相应的包装器
  • 有没有可能使用装饰师?表单将包含新字段,因此在不修改当前视图的情况下,我认为这是不可能的
  • 或者,除了将此视图复制到我的应用程序并进行修改之外,没有其他方法了吗
    我将根据您的伪代码回答您的三个问题,
    post\u question\u view
    是一个老式的(非基于类的)Django视图,没有参数:

  • 不,如果两个视图重复代码,那么创建一个调用其中一个视图的包装器是不容易的。这只是将重复代码隐藏在包装器后面

  • 不,如果
    post\u question\u视图
    没有任何参数来修改它的行为,比如使用不同的表单,那么装饰师就帮不上忙了

  • 不。视图的编写方式不允许进行这些修改。一方面,它没有可以按您想要的方式改变其行为的参数——如果有,您可以使用这些参数。另一方面,它不是一个将其功能组织到可重写字段和方法中的子类——如果是,您可以对视图进行子类化,并重写适当的字段和方法


  • 我所说的有一个例外是基于技术性的。您可以使用Python的
    inspect
    模块在运行时获取代码中原始视图的源代码,然后在运行时在文本级别上修改代码,然后在运行时评估该代码以创建新视图。这在技术上是枯燥的,因为你没有在源代码中重复你自己,但这根本不是人们所说的枯燥,因为这是一个可爱的技巧,而不是使用合理的代码组织和架构来避免源代码重复。

    你真的应该发布一些真实的代码示例,因为选项可能会因第三方视图实现的不同而有所不同。您试图在此处描述的视图是由您编写的还是由第三方应用程序编写的?对于这种模棱两可的代码很难,你能更接近真实场景吗?源函数(你想要扩展的)是否有必要的形式参数来传递你想要的(例如不同的形式)?