【问题标题】:(Django) How to assign the username of current user to some other model in a view?(Django)如何将当前用户的用户名分配给视图中的其他模型?
【发布时间】:2019-08-07 22:51:22
【问题描述】:

我想将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')

froms.py

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

views.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 model object

【问题讨论】:

  • 你不应该这样做。只要有一个从乘客到用户的外键。
  • 谢谢。我这样做了。但是,将passenger.username 分配给当前登录用户的用户名的那一行代码是什么?因为使用当前设置,它给我一个错误“NOT NULL 约束失败”。

标签: django django-models django-forms django-views django-admin


【解决方案1】:

首先,这样做没有任何意义。您应该为用户模型创建一个 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')

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

【讨论】:

  • 感谢您的快速回复。我尝试使用 request.user.username 并将其设为 ForeignKey 但这并不能解决问题。再次,用户名字段保持空白,因为这次它有 null = False,它给我一个错误“NOT NULL 约束失败”。
  • 如果您将用户名字段更改为外键,那么您应该使用request.user。基本上request.user 返回像外键这样的字段将接受的用户对象。如果您只需要用户名字符串,那么您应该使用request.user.username 调用它
  • 我已根据您的代码更改了乘客模型。我也有这个:'passenger_details.username = request.user'。它显示错误:NOT NULL 约束失败/
  • 正如我所解释的:request.user 将返回用户对象而不是用户名。你应该得到这样的用户名:request.user.username
【解决方案2】:

虽然@Navid2zp 的回答是正确的,但您遇到的另一个问题是这一行:

passenger_details.username = request.user

passenger_details 是一个ModelForm,初始化后它没有属性username。它有一个字段username,如果表单具有data,则可以作为绑定字段(passenger_details['username']) 或作为表单字段(passenger_details.fields['username']) 访问。

通过赋予它username 属性,您将一无所获,因为它不会以任何方式与字段username 关联。

但在保存表单实例之前为其分配附加参数的最简单方法如下:

profile = passenger_details.save(commit=False)  # gives you the instance
profile.user = request.user  # assuming you're using `ForeignKey` here, calling it `user` instead of `username` for clarity
profile.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2010-10-18
    • 2020-09-15
    • 1970-01-01
    • 2021-03-13
    相关资源
    最近更新 更多