首页 > 解决方案 > 在 html 个人资料页面中使用注册名字

问题描述

我想在用户成功注册并创建个人资料后在他们的个人资料上显示他们的名字。

这是我在 profile.html 页面中尝试过的

<div class="sidebar-block">
  <div class="profile">
    <a href="#">
      <img src="{% static 'second/images/people/110/guy-6.jpg' %}" alt="your picture" class="img-circle width-80" />
    </a>
    <h4 class="text-display-1 margin-none">{{ Mentor.firstname }}</h4>
  </div>
</div>

这是我的 models.py 文件

#mentor model
class User(AbstractUser):
    is_student = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)
...
class Mentor(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    email = models.EmailField(max_length=100)
    firstname = models.CharField(max_length=100)
    lastname = models.CharField(max_length=100)
    linkedin = models.URLField(max_length=200,null=True,blank=True)
    phonenumber = models.IntegerField(null=True,unique=True)

表格.py

class TeacherSignUpForm(UserCreationForm):
    email = forms.EmailField(max_length=100)
    firstname = forms.CharField(max_length=100)
    lastname = forms.CharField(max_length=100)
    phonenumber = forms.IntegerField(required=True)
    linkedin = forms.URLField(max_length=200)

    class Meta(UserCreationForm.Meta):
        model = User

    def save(self, commit=True):
        self.instance.is_teacher = True
        user = super().save()
        mentor = Mentor.objects.create(
            user=user,
            email=self.cleaned_data['email'],
            firstname=self.cleaned_data['firstname'],
            lastname=self.cleaned_data['lastname'],
            phonenumber=self.cleaned_data['phonenumber'],
            linkedin=self.cleaned_data['linkedin']
        )
        return user

和老师(views.py)

class TeacherSignUpView(CreateView):
    model = User
    form_class = TeacherSignUpForm
    template_name = 'registration/signup_form.html'

    def get_context_data(self, **kwargs):
        kwargs['user_type'] = 'teacher'
        return super().get_context_data(**kwargs)

    def form_valid(self, form):
        user = form.save()
        login(self.request, user)
        return redirect('teachers:app-instructor-dashboard')

我知道如果我写 {{user.username}} 我将获得用于注册的用户名,但似乎无法获得任何其他信息

更新

在根据答案之一进行更改后,这是我现在拥有的代码

模型.py

class Mentor(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True)
    linkedin = models.URLField(max_length=200,null=True,blank=True)
    phonenumber = models.IntegerField(null=True,unique=True)

和forms.py

class TeacherSignUpForm(UserCreationForm):
    email = forms.EmailField(max_length=100)
    first_name = forms.CharField(max_length=100)
    last_name = forms.CharField(max_length=100)
    phonenumber = forms.IntegerField(required=True)
    linkedin = forms.URLField(max_length=200)

    class Meta(UserCreationForm.Meta):
        model = User
        fields = ('email', 'username', 'first_name', 'last_name')

    def save(self, commit=True):
        self.instance.is_teacher = True
        user = super(UserCreationForm, self).save(commit=False)
        mentor = Mentor.objects.create(
            user=user,
            phonenumber=self.cleaned_data['phonenumber'],
            linkedin=self.cleaned_data['linkedin']
        )
        return user

现在我收到此错误消息:

禁止 /accounts/signup/teacher/save() 处的 ValueError 以防止由于未保存的相关对象“用户”而导致数据丢失。

即使运行后我仍然收到此错误

python manage.py makemigrations

标签: pythondjango

解决方案


User已经有了名字和姓氏,您可以重复使用它而不是添加到新模型Mentor中。在保存之前user,只需像这样更新这些字段:

user = super(UserCreationForm, self).save(commit=False)
user.first_name = self.cleaned_data['firstname']
user.last_name = self.cleaned_data['lastname']
user.save()

完整示例:

楷模:

class Mentor(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    linkedin = models.URLField(max_length=200,null=True,blank=True)
    phonenumber = models.IntegerField(null=True,unique=True)

class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    ...

形式:

class TeacherSignUpForm(UserCreationForm):
    email = forms.EmailField(max_length=100)
    first_name = forms.CharField(max_length=100)
    last_name = forms.CharField(max_length=100)
    phonenumber = forms.IntegerField(required=True)
    linkedin = forms.URLField(max_length=200)

    class Meta(UserCreationForm.Meta):
        model = User  # use the model from from django.contrib.auth.models import User
        fields = ('email', 'username', 'first_name', 'last_name')

    def save(self, commit=True):
        user = super(UserCreationForm, self).save()
        mentor = Mentor.objects.create(
            user=user,
            phonenumber=self.cleaned_data['phonenumber'],
            linkedin=self.cleaned_data['linkedin']
        )
        return user

推荐阅读