2017-01-12 21 views
0

我對用戶有複雜的用戶定義權限。但爲了讓思考變得更簡單,讓我們假設每個用戶只有read-onlywrite權限。使Django在模板中返回forms.instance

我使用Django表單編輯和保存模型對象。而我的目標是呈現<input>在Django的HTML模板爲那些誰擁有編輯某個給定的模型實例的權限的用戶,和一個硬編碼的數據(不<input>標籤),如果用戶只具有隻讀權限。

目前,我有下面的代碼在我的Django的模板來實現這一目標:

{%if user.has_permission_to_edit %} 
    {{my_form.my_field}} 
{% else %} 
    {{my_form.instance.my_field}} 
{% endif %} 

而這裏的my_form

class MyForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     for field_name, field in self.fields.items(): 
      field.widget.attrs['class'] = 'form-control input-sm' 
      if field.required == True: 
       field.widget.attrs['required'] = '' 
    class Meta: 
     model = MyModel 
     fields = ('my_field',) 

與模板代碼的問題是,我有使用多個{%if%} {%else%}塊。我對Django比較陌生,我知道有很多先進的工具使Django代碼可能超級幹,所以我想問你們,什麼是組織我在模板中描述的最乾燥的方法。具體來說,是否有任何方法可以使Django根據表單定義中指定的某些條件返回實例值?或者我需要一些使用定義的標籤?或者也許有一些完全不同的架構被用來實現這樣的目標?

+1

我不知道我明白你想達到什麼目的?你在編輯模型對象嗎?如果用戶有編輯權限,行爲如何改變? – AKS

+0

哪種類型的字段是你想要顯示硬編碼值的地方?它是一個文本字段嗎? – AKS

+0

嗯,它可以是文本字段,數值,複選框......任何東西。根據各自模型字段類型的類型 –

回答

0

對於我理解的格式你的問題,你想通過從數據源獲取數據的實例。

from .forms import MyForm 
from django.shortcuts import render 

假設您已經在views.py級別創建了forms.py文件。

從數據源(詳細信息是模型在下面的示例)獲取數據

detail_instance = Detail.objects.get(user=request.user.id) 
reg_form = MyForm(instance=detail_instance or None) 
# In case of edit scenario you can pass in the post params to the form as well 
reg_form = MyForm(request.POST, instance=detail_instance) 
# Or form with uploads 
reg_form = MyForm(request.POST, request.FILES, instance=detail_instance) 

現在,一旦我們有我們的reg_form參數中的數據,我們可以通過它在模板

return render(request, 'applicant/register.html', { 'my_form' : reg_form}) 

待辦事項無論你希望如何,在你的模板中使用my_form變量。

基於更新的問題

可以傳遞參數到表單

reg_form = MyForm(exist = exist, some_param = param_value, instance=detail_instance or None) 

的init函數傳遞PARAM後,PARAM可以取出並在init函數處理表格

class MyForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     exist = kwargs.pop('exist', None) 
     pk_reg = kwargs.pop('param', None) 
     super(MyForm, self).__init__(*args, **kwargs) 
     #do some stuff with you custom params here 
     if exist == True or pk_reg: 
      self.fields['username'].widget.attrs['readonly'] = True 

上述方法有一個替代方案,以及具有單獨的形式單獨燙髮ission並根據用戶權限調用適當的表單。