首页 > 解决方案 > 如何将登录用户的用户名添加到 django 中的模型字段

问题描述

如何将当前登录用户的用户名添加到我的模型中的字段?例如,我需要在模型中存储有关用户的信息,例如姓名、电子邮件等,而不是默认的 Django 用户模型,但我仍然使用默认的一个来存储凭据。我想建立它们之间的关系,所以我username在我的模型中创建了字段。保存相应表单后如何用当前用户的用户名填写?我的模型

class ApplicantProfile(models.Model):
    name = models.CharField(max_length = 50)
    dob = models.DateField()
    email = models.EmailField()
    description = models.TextField()
    username = <something>

<something>用什么来改变?

我的表格

class ApplicantProfileEdit(forms.ModelForm):
class Meta:
    model = ApplicantProfile
    fields = [
        'name',
        'dob',
        'email',
        'description',
    ]

我的观点

def ApplEditView(request):
    form = ApplicantProfileEdit(request.POST or None)
    if form.is_valid():
       form.save()
       form = ApplicantProfileEdit()
    context = {
       'form':form
    }
    return render(request, "applProfileEdit.html", context)

PS我试图将模型直接导入我的views.py,并在我的视图中分配request.user.usernameusername模型的字段,但它不起作用,只是将该字段留空。usernameCharField我尝试这个时,我就有了。

标签: pythondjango

解决方案


保存用户名本身不是一个好主意,或者至少不是没有FOREIGN KEY约束。如果稍后用户更改其名称,则用户名现在指向一个不存在的用户,如果稍后另一个用户将其用户名更改为该用户名,那么您ApplicantProfile将指向错误的用户。

通常使用一个ForeignKey字段 [Django-doc],或者如果每个都ApplicantProfile指向不同的用户,则使用OneToOneField[Django-doc]

from django.conf import settings
from django.db import models

class ApplicantProfile(models.Model):
    name = models.CharField(max_length = 50)
    dob = models.DateField()
    email = models.EmailField()
    description = models.TextField()
    # maybe a OneToOneField
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

在视图中:

from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect

@login_required
def appl_edit_view(request):
    if request.method == 'POST':
        form = ApplicantProfileEdit(request.POST)
        if form.is_valid():
            form.instance.user = request.user
            form.save()
            return redirect('some-view-name')
    else:
        form = ApplicantProfileEdit()
    context = {
        'form':form
    }
    return render(request, 'applProfileEdit.html', context)

注意:如果 POST 请求成功,您应该制作一个redirect [Django-doc] 来实现Post/Redirect/Get模式 [wiki]。这样可以避免在用户刷新浏览器时发出相同的 POST 请求。

 

注意:您可以使用@login_required装饰器 [Django-doc]将视图限制为经过身份验证的用户的视图 。


推荐阅读