2013-12-15 55 views
1

我已經爲一個功能創建了一個單獨的應用程序,我打算使用這個第三方應用程序進行擴展,我不打算觸摸它的代碼。Django:如何使用DRY原則覆蓋第三方視圖?

該視圖我想擴展,張貼問題或獲取用戶提出問題的形式。 我想使用此視圖發佈文章。它使用的形式是不同的。

的僞代碼如下:

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) 

大部分的代碼是有與需要做輕微的爭吵。我需要填寫幾個空白,並添加一些新的空白到現有的代碼。 我如何使用幹princliple做到這一點?

  1. 我應該爲2個函數創建一個包裝並根據請求調用合適的包裝嗎?
  2. 可以使用裝飾器嗎?表單將包含新字段,因此不修改當前視圖,我不認爲它是可能的。
  3. 或者除了將這個視圖複製到我的應用程序並進行修改之外,沒有別的辦法嗎?
+4

你應該真的發佈一些真實的代碼示例,因爲選項可能會有所不同,這取決於第三方視圖的實現。 –

+2

您試圖在此描述的視圖是由您還是第三方應用程序編寫的?由於這種模糊的代碼很難,你能更接近真實的情況嗎? – Arpit

+0

源函數(你想要擴展的)是否有必要的形式參數來傳遞你想要的東西(例如不同的形式)? – sergzach

回答

2

我要回答基於僞代碼假設你的三個問題post_question_view是一個老式的(基於類的沒有)Django的視圖不帶參數:

  1. 沒有,創建如果兩個視圖重複代碼,則調用兩個視圖中的一個視圖的包裝器不是DRY。這只是隱藏了包裝器後面的重複代碼。

  2. 不,沒有post_question_view有任何參數來修改其行爲,如使用不同的形式,裝飾器將無濟於事。

  3. 不是。視圖不是以允許這些修改的方式編寫的。在其中一個沒有參數可以按照你想要的方式改變它的行爲 - 如果它有,你可以使用這些參數。另一方面,它不是class-based view,它的功能被組織成可重寫的字段和方法 - 如果是的話,你可以對視圖進行子類化並覆蓋適當的字段和方法。

有一個例外,我說什麼基於技術性。您可以使用Python的inspect模塊在運行時在代碼中獲取原始視圖的源代碼,然後在運行時逐字修改文本級別的代碼,然後在運行時評估代碼以創建新視圖。從技術上來說,這是DRY,因爲你不是在源代碼中重複自己,但DRY完全不是人們的意思,因爲這是一個可愛的技巧,而不是使用健全的代碼組織和體系結構來避免源代碼重複。

相關問題