首页 > 解决方案 > (Django)如何将当前用户的用户名分配给视图中的其他模型?

问题描述

我想将Passengers模型的用户名字段分配给当前登录用户的用户名。我好像做不到。下面是代码。

模型.py

class UserProfileInfo(models.Model):

        user = models.OneToOneField(User,on_delete=models.CASCADE)
        profile_pic = models.ImageField(upload_to='profile_pics',blank=True)

        def __str__(self):
            return self.user.username

class Passengers(models.Model):
        username = models.CharField(max_length = 100)
        passenger_firstname = models.CharField(max_length = 100)
        passenger_lastname = models.CharField(max_length = 100)
        passenger_age = models.CharField(max_length = 100)
        passenger_gender =  models.CharField(max_length=6, choices=GENDER_CHOICES, default='female')

来自s.py

class PassengerForm(forms.ModelForm):
    class Meta():
        model = Passengers
        fields = (
        'passenger_firstname',
        'passenger_lastname',
        'passenger_age',
        'passenger_gender')

视图.py

def passenger_info(request):

    if request.method == "POST":

        passenger_details = PassengerForm(data=request.POST)

        if passenger_details.is_valid():
            passenger_details.username = request.user
            passenger_details.save()

    else:
        passenger_details = PassengerForm()

    return render(request,'passenger_info.html',{'passenger_details':passenger_details})

没有打印出错误消息,但它使用户名字段留空,如下所示:

django-admin 模型对象

标签: djangodjango-modelsdjango-formsdjango-viewsdjango-admin

解决方案


首先,这样做没有任何意义。您应该为用户模型创建一个 ForeignKey。

request.user将返回用户对象而不是用户名,所以如果你需要用户名,你应该调用它:request.user.username

并解决您的问题:

class Passengers(models.Model):
    username = models.ForeignKey(User, null=False, blank=False)
    passenger_firstname = models.CharField(max_length = 100)
    passenger_lastname = models.CharField(max_length = 100)
    passenger_age = models.CharField(max_length = 100)
    passenger_gender =  models.CharField(max_length=6, choices=GENDER_CHOICES, default='female')

您也可以从 User 模型中获取名字和姓氏。性别和年龄也应该在UserProfileInfo模型中更有意义,Passengers模型应该是关于将用户连接到公共汽车、飞机等而不是保存不会改变的数据。


推荐阅读