2017-01-14 3 views
0

ich dieses Django Modell erstellt haben:Anzeige auth.User Felder in verwandten Modell

class Teacher(models.Model): 
    user = models.OneToOneField('auth.User', on_delete=models.CASCADE, default=1) 
    surname = models.CharField(max_length=15, null=True) 
    creation_date = models.DateTimeField('creation date', auto_now_add=True) 
    deletion_date = models.DateTimeField('deletion date', null=True, blank=True) 

und eine Form, die sie vertreten im schreibgeschützten Modus:

class TeacherViewForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(TeacherViewForm, self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     if instance and instance.pk: 
      for field in self.fields: 
       self.fields[field].widget.attrs['disabled'] = True 

    class Meta: 
     model = Teacher 
     exclude = ['deletion_date'] 

Die Ansicht wie folgt aussieht:

class TeacherViewDetail(generic.DetailView): 
    model = Teacher 
    template_name = 'control/teacher_detail.html' 
    form_class = TeacherViewForm 

    def get_form(self): 
     # Instantiate the form 
     form = self.form_class(instance=self.object) 

     return form 

    def get_context_data(self, **kwargs): 
     context = super(TeacherViewDetail, self).get_context_data(**kwargs) 
     context.update({ 
      'form': self.get_form(), 
     }) 

     return context 

Wie Sie sehen können, gibt es eine OneToOne Beziehung zwischen dem Teacher und 012.Modelle. Ich muss first_name und last_name von auth.User Modell anzeigen, aber nur die username wird angezeigt.

Wie kann ich diese Felder auf dieselbe Weise anzeigen, wie das Feld Teacher.surname angezeigt wird? Muss ich sie in das Modell, die form.fields, aufnehmen oder muss ich eine Eigenschaft ändern, um sie zu erreichen?

Dank

Antwort

0

Sie würden die user Feld entfernen haben und die entsprechenden Felder statt hinzuzufügen. Dann in Ihrer Form des __init__, füllen Sie die Anfangswerte:

# forms.py 
class TeacherViewForm(ModelForm): 
    first_name = forms.CharField() 
    last_name = forms.CharField() 

    def __init__(self, *args, **kwargs): 
     super(TeacherViewForm, self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     if instance and instance.pk: 
      for field in self.fields: 
       self.fields[field].widget.attrs['disabled'] = True 
      # set initial values 
      self.fields['first_name'].initial = instance.user.first_name 
      self.fields['last_name'].initial = instance.user.last_name 

    class Meta: 
     model = Teacher 
     exclude = ['user', 'deletion_date'] # exclude user 

Aber warum verwenden Sie ein Formular überhaupt, wenn Sie alle Felder deaktivieren? Sie können all diese Informationen einfach viel freier in der Vorlage rendern.

+0

Danke. Ich brauche keine Zeichenkette, die geeignet ist, den Benutzer zu repräsentieren, sondern auth.User-Felder (vorname und nachname) auf die gleiche Weise anzuzeigen, wie Lehrerfelder angezeigt werden. – juankysmith

+0

Was meinen Sie mit Lehrerfeldern? – schwobaseggl

+0

Lehrerfelder sind "Nachname" und "Erstellungsdatum" ("Löschdatum" ist ausgeschlossen). In der Vorlage möchte ich in der Lage sein, diese Lehrer Felder mit 'first_name' und 'last_name' von auth.User Modell – juankysmith

Verwandte Themen