2010-12-19 4 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

모든 필드 편집을위한 관리자를 사용하고 단지 렌더링하는 아주 쉬운 것입니다 페이지 템플릿의 학생 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이 로그인하면 필드를 쓸 수 있습니다. 그렇지 않으면 클래스 상수의 필드 만 읽기 전용으로 변경됩니다.

관련 문제