2010-12-19 5 views
4

Ich habe ein schreibgeschütztes Feld in einem Django-Formular, das ich manchmal bearbeiten möchte.
Ich möchte nur den richtigen Benutzer mit den richtigen Berechtigungen, um das Feld zu bearbeiten. In den meisten Fällen ist das Feld gesperrt, aber ein Administrator könnte dies bearbeiten.Wie werden optional schreibgeschützte Felder in Django-Formularen erstellt?

Mit der init Funktion kann ich das Feld schreibgeschützt oder nicht, aber nicht optional schreibgeschützt machen. Ich habe auch versucht, ein optionales Argument an StudentForm zu übergeben. init aber das wurde viel schwieriger, dass ich erwartet hatte.

Gibt es einen richtigen Weg, dies zu erreichen?

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)) 

Antwort

0

Es wäre ziemlich einfach, den Admin für jedes Feld Bearbeitung zu verwenden und einfach zu machen die Studenten-ID in der Seitenvorlage.

Ich bin mir nicht sicher, ob dies Ihre Fragen beantwortet.

7

Ist es das wonach Sie suchen? Durch Ihren Code ein wenig ändern:

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)) 

So ist die Sache, die Berechtigungen für die Ansichten Ebene zu überprüfen, und dann Argument zu übergeben Ihr Formular, wenn es initialisiert wird. Wenn Mitarbeiter/Administrator angemeldet ist, können Felder beschreibbar sein. Wenn nicht, werden nur Felder aus der Klassenkonstante in schreibgeschützt geändert.

Verwandte Themen