2010-12-19 37 views
4

私は時々編集したいdjango形式の読み取り専用フィールドを持っています。
フィールドを編集するための適切な権限を持つ適切なユーザーのみが必要です。ほとんどの場合、フィールドはロックされていますが、管理者がこれを編集できます。djangoフォームでオプションで読み取り専用フィールドを作成するには?

の機能を使用すると、フィールドを読み取り専用にするかどうかを指定できますが、オプションで読み取り専用にすることはできません。私はまた、StudentFormにオプションの引数を渡そうとしました。 でも、それは私が予想していたよりはるかに難しいものでした。

これを行う適切な方法はありますか?

models.py

class Student(): 
    # is already assigned, but needs to be unique 
    # only privelidged user should change. 
    student_id = models.CharField(max_length=20, primary_key=True) 
    last_name = models.CharField(max_length=30) 
    first_name = models.CharField(max_length=30) 
    # ... other fields ... 

forms.py

class StudentForm(forms.ModelForm): 
    class Meta: 
    model = Student 
    fields = ('student_id', 'last_name', 'first_name', 
    # ... other fields ... 


    def __init__(self, *args, **kwargs): 
     super(StudentForm, self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     if instance: 
      self.fields['student_id'].widget.attrs['readonly'] = True 

views.py

def new_student_view(request): 
    form = StudentForm() 
    # Test for user privelige, and disable 
    form.fields['student_id'].widget.attrs['readonly'] = False 
    c = {'form':form} 
    return render_to_response('app/edit_student.html', c, context_instance=RequestContext(request)) 

答えて

0

任意のフィールド編集にadminを使用し、ちょうどレンダリングするために、かなり簡単だろうページテンプレートの生徒ID。

これがあなたの質問に答えるかどうかはわかりません。

7

これはあなたが探しているものですか?あなたのコードを修正することで少し:

forms.py

class StudentForm(forms.ModelForm): 

    READONLY_FIELDS = ('student_id', 'last_name') 

    class Meta: 
     model = Student 
     fields = ('student_id', 'last_name', 'first_name') 

    def __init__(self, readonly_form=False, *args, **kwargs): 
     super(StudentForm, self).__init__(*args, **kwargs) 
     if readonly_form: 
      for field in self.READONLY_FIELDS: 
       self.fields[field].widget.attrs['readonly'] = True 

views.py

def new_student_view(request): 

    if request.user.is_staff: 
     form = StudentForm() 
    else: 
     form = StudentForm(readonly_form=True) 

    extra_context = {'form': form} 
    return render_to_response('forms_cases/edit_student.html', extra_context, context_instance=RequestContext(request)) 

そうなことは、ビューレベルでのアクセス権を確認するために、その後に引数を渡すことですあなたのフォームは初期化されます。 staff/adminがログインしている場合、フィールドは書き込み可能になります。そうでない場合は、クラス定数のフィールドだけが読み取り専用に変更されます。

関連する問題