(Django) Как назначить имя пользователя текущего пользователя какой-либо другой модели в представлении? - PullRequest
0 голосов
/ 17 марта 2019

Я хочу назначить поле имени пользователя модели «Пассажиры» имени текущего пользователя, вошедшего в систему.Я не могу этого сделать.Ниже приведен код.

Models.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

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Хотя ответ @ Navid2zp верен, другая проблема, с которой вы столкнулись, связана с этой строкой:

passenger_details.username = request.user

passenger_details - это ModelForm, и после инициализации он не имеет атрибута username. Он имеет поле username, к которому можно получить доступ как связанное поле (passenger_details['username']), если форма имеет data, или как поле формы (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()
0 голосов
/ 17 марта 2019

Прежде всего не имеет смысла делать это так. Вы должны создать 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 должна предусматривать привязку пользователей к автобусу, самолету и т. д., чтобы они не хранили данные, которые не будут меняться.

...