2014-03-24 52 views
1

我是django的新手,我需要完成的任務是AngularJs到老式web 1.0 django應用程序(適用於舊版瀏覽器)的一個端口。有一個我正在處理的未知數,並且是與$ scope在角度相關的函數。我不知道如何在Django中複製該邏輯。移植到DJango Web(1.0)風格:從Django調用函數模板

一個例子是(在角):

<div ng-show="isAuthorizedAs('Administrator')"></div> 

然後在控制器:

$scope.isAuthorizedAs = function(functionalRole) { 
    if($scope.user.role == 'basic'){ 
     if(functionalRole == 'basic') return true 
    } 
    else if($scope.user.role == 'advanced'){ 
     if(functionalRole == 'basic') return true 
     if(functionalRole == 'advanced') return true 
    } 
    else if($scope.user.role == 'administrator'){ 
     if(functionalRole == 'basic') return true 
     if(functionalRole == 'advanced') return true 
     if(functionalRole == 'administrator') return true 
    } 

    return false 
} 

要點是,控制器或者具有複雜的邏輯(即在一個模型的工作或多種型號)或特殊格式。我意識到這些可能是非最佳用例,並且上面的JavaScript函數留下了很多不足之處 - 但兩個目標都在我的直接執行路徑中。

我的目標是在一週內完成此功能 - 而且不希望與AngularJs模板/應用程序有很大差異。因此,我願意承認我交付的非最佳解決方案 - 然後在未來的日期重新考慮。

謝謝

+0

什麼問題你面對?你可以隨時檢查一個用戶是否是管理員,或者甚至有一個模型方法。當前用戶對象始終可用於模板。你可以檢查並顯示該div。這是Web框架的標準程序。即使Angular也在這樣做。那'ng-show'並不神奇。它背後有相同的工作流程。你在找什麼? –

+0

如何從django框架中調用自定義函數。以上是一個用例,但有很多。我在問這是如何在Django中完成的?我是否需要將函數粘貼到對象中並將其傳遞給渲染器?有另一種方法嗎?什麼是最好的方法? – akaphenom

+0

TBH,聽起來像我,你甚至沒有嘗試在Django做到這一點。 –

回答

0

我不能完全確定你的問題是什麼。你正在尋找的是檢查登錄的用戶是否是管理員,如果這樣渲染模板的一部分。這是您學習Django時學習的基本知識之一。不過,這裏是你如何實現上述情況。

我不知道你的用戶模型是什麼樣子,因爲你沒有提到它。所以我假設你的用戶模型有一個名爲role的字段,它可以設置爲basic,advancedadministrator。現在,當您登錄到Django時,如果您在settings.pyTEMPLATE_CONTEXT_PROCESSORS設置中有django.contrib.auth.context_processors.auth,則當前登錄的用戶對象在名爲user的變量內的模板中可用。

然後在模板你可以做到這一點 -

{% if user.role == 'administrator' %} 
<div class="secret_div"> 
    Super Secret Information Here 
</div> 
{% endif %} 

如果您的用戶模型中沒有任何這樣的領域,你必須檢查,如果用戶是管理員的其他一些方法,你可以添加方法通過繼承默認的User類或創建您自己的用戶模型來實現用戶對象。

class User(AbstractBaseUser, PermissionsMixin): 
    """ 
    Username, password and email are required. Other fields are optional. 
    """ 
    username = models.CharField(_('username'), max_length=30, unique=True, 
     help_text=_('Required. 30 characters or fewer. Letters, digits and ' 
        '@/./+/-/_ only.'), 
     validators=[ 
      validators.RegexValidator(r'^[\[email protected]+-]+$', _('Enter a valid username.'), 'invalid') 
     ]) 
    first_name = models.CharField(_('first name'), max_length=30, blank=True) 
    last_name = models.CharField(_('last name'), max_length=30, blank=True) 
    email = models.EmailField(_('email address'), unique=True) 

    # more fields here 

    class Meta: 
     verbose_name = _('user') 
     verbose_name_plural = _('users') 

    def get_role(self): 
     """ 
     Returns the role of the user 
     """ 
     return magic_method_to_check_role(self) 

然後酷似之前,你可以做到這一點

{% if user.get_role == 'administrator' %} 
<div class="secret_div"> 
    Super Secret Information Here 
</div> 
{% endif %} 
+0

{%if someFuntion(user,'administrator')%} blah {%endif%} - 我問的問題是如何從模板完成調用函數。那有意義嗎? – akaphenom

+0

您不能使用Django模板中的參數調用函數。您可以做的最好的是創建一個自定義模板標籤。 https://docs.djangoproject.com/en/1.6/howto/custom-template-tags/ –