2017-01-12 4 views
0

私はユーザに対して複雑なユーザ定義の権限を持っています。しかし、もっと簡単に思うには、それぞれのユーザーに対してread-onlyまたはwriteのアクセス許可しかないとしましょう。Djangoフォームはテンプレート内のforms.instanceを返すようにする

私はモデルオブジェクトを編集して保存するためにDjangoフォームを使用しています。そして私の目標は、与えられたモデルインスタンスを編集する権限を持つユーザのためにDjango HTMLテンプレートに<input>をレンダリングし、ユーザに読み取り専用のアクセス権しかない場合はハードコードされたデータ(<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のコードをスーパーDRYにする高度なツールがたくさんあることを知っていますので、テンプレートに記述したものを整理する最もDRY的な方法は何ですか?具体的には、フォーム定義内で指定されたいくつかの条件に基づいてDjangoフォームがインスタンス値を返すようにする方法はありますか?あるいは、定義済みのタグを使用する必要がありますか?または、このような目標を達成するために全く異なるアーキテクチャが使用されているかもしれませんか?

+1

私はあなたが達成したいことを理解していますか分かりませんか?あなたはモデルオブジェクトを編集していますか?ユーザーに編集権限がある場合、その動作はどのように変更されますか? – AKS

+0

ハードコードされた値を表示するフィールドのタイプはどれですか?テキストフィールドですか? – AKS

+0

これは、テキストフィールド、数値、チェックボックスなどがあります。それぞれのモデルフィールドタイプのタイプに基づいて –

答えて

0

私があなたの質問から理解したところでは、データソースからフェッチされたデータのインスタンスを渡したいと思っています。

from .forms import MyForm 
from django.shortcuts import render 

views.pyのレベルでforms.pyファイルを作成したと仮定します。データ・ソースからの

フェッチデータ(詳細は、例えば、下記にモデル)、我々はテンプレートにそれを渡すことができます私たちはreg_formパラメータ内のデータを持っていたら、今

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) 

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

ドゥテンプレート内のmy_form変数。更新された質問に基づく

あなたはPARAMを通過した後、フォーム

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

のinit関数にパラメータを渡すことができ

、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 

上記のアプローチには、別のパーマユーザー権限に基づいて適切なフォームを発行して呼び出します。

関連する問題