python - 在 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
解决方案
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
推荐阅读
- c# - Blazor WebAssembly 应用程序 - 来自浏览器的 API 调用 - 抱歉,此地址没有任何内容
- c++ - 按钮和文本重叠
- c# - C# 中的远程桌面客户端访问图像数据
- java - 如何为 Map 类型的 RequestParam 指定默认值
? - c++ - msvc 等效于函数、参数和局部变量的 __attribute__((unused))
- rust - 使用 const 通过强制转换计算其他 const 表达式
- flutter - 使用循环跳过 StreamBuilder 中的列表项
- javascript - 使用 React-NextJS 模拟 Chrome 扩展的慢速网络连接
- csv - 我可以将 csv 从 url 链接到 google 电子表格吗?
- reactjs - 如何在 create-react-app 中的 web worker 中导入已安装的节点模块?