2017-08-29 2 views
0

J'utilise actuellement Django tout-auth, et il y a une page/accounts/profile que je veux créer/remplir avec un formulaire qui met à jour les informations utilisateur.Création d'une page de profil utilisateur en utilisant le champ OneToOne avec le modèle utilisateur

J'ai un champ Enseignant, qui étend le modèle utilisateur en utilisant le champ OneToOne.

models.py

class Teacher(models.Model): 
    user = models.OneToOneField(User, on_delete=models.PROTECT, related_name='Teacher') 
    bio = models.TextField(max_length=500, blank=True) 
    availability = models.BooleanField(default=False) 
    teacher_logo = models.FileField() 

Ce modèle d'enseignant est ce que je veux que l'utilisateur de mettre à jour dans/comptes/profil.

forms.py

class UserForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ('first_name', 'last_name', 'email') 

class TeacherForm(forms.ModelForm): 
    class Meta: 
     model = Teacher 
     fields = ('availability', 'bio','teacher_logo') 

views.py

@login_required 
@transaction.atomic 
def update_profile(request): 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, instance=request.user) 
     teacher_form = TeacherForm(request.POST, instance=request.user.teacher) 
     if user_form.is_valid() and teacher_form.is_valid(): 
      user_form.save() 
      teacher_form.save() 
      messages.success(request, _('Your profile was successfully updated!')) 
      return redirect('users:index') 
     else: 
      messages.error(request, _('Please correct the error below.')) 
    else: 
     user_form = UserForm(instance=request.user) 
     teacher_form = TeacherForm(instance=request.user.teacher) 
    return render(request, 'accounts/profile.html', { 
     'user_form': user_form, 
     'teacher_form': teacher_form 
    }) 

utilisateurs du modèle/profile.html

<form method="post"> 
    {% csrf_token %} 
    {{ user_form.as_p }} 
    {{ teacher_form.as_p }} 
    <button type="submit">Save changes</button> 
</form> 

urls.py

url(r'^profile/$', views.update_profile, name='Update-Profile') 

Je peux utiliser une vue de la mise à jour, mais je dois préciser dans l'URL, ce qui semble une mauvaise façon de le faire; En outre, les utilisateurs pourront modifier les profils de quelqu'un d'autre. Lorsque j'exécute ce qui précède, je reçois une plainte disant que l'objet 'Utilisateur' n'a pas d'attribut 'enseignant'.

Lorsque je retire .teacher de TeacherForm(instance=request.user.teacher) Il charge la page avec la forme, mais quand je mets à jour, il me donne toujours la même plainte (retirée dans les deux endroits views.py)

EDIT: models.py supplémentaire

@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Teacher.objects.create(user=instance) 

@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.Teacher.save() 

Répondre

1

vous définissez comme nom associé Teacher, vous devez donc:

teacher_form = TeacherForm(instance=request.user.Teacher) 
#            ^^^^ 

ou mieux définir related_name à « professeur »

class Teacher(models.Model): 
    user = models.OneToOneField(
     User, 
     on_delete=models.PROTECT, 
     related_name='teacher') 
#      ^^^ 
+1

ou tout simplement ne définissez pas du tout, dans ce cas, la valeur par défaut sera 'teacher' de toute façon. –

+0

Merci, je reçois toujours: Exception Valeur: \t L'objet 'User' n'a pas d'attribut 'enseignant' Exception Emplacement: \t /Users/gr/Desktop/PycharmProjects/DjangoWebsite/accounts/models.py dans save_user_profile, ligne 45 (le fichier n'a pas la ligne 45) – Roma

+0

avez-vous créé l'instance 'Teacher'? –