Как сделать поле имени пользователя Django экземпляром в представлении
Я работаю над проектом Django Ticketing, где я хочу, чтобы гость активировал PIN-код билета, а затем зарегистрировался на мероприятии, на которое он купил билет. И я хочу, чтобы у гостевого пользователя был доступ для входа в систему и обновления профиля. Проблема в том, что у меня есть страница просмотра формы активации PIN-кода, а затем следует форма регистрации гостя, которая дает гостю доступ к предоставлению имени пользователя и пароля для входа после успешной регистрации, чтобы он мог обновить свой профиль. У меня есть две проблемы с моим кодом следующим образом:
- Мне нужно, чтобы значение PIN хранилось в модели гостя, поэтому я хочу получить значение PIN из представления активации PIN в представление регистрации гостя (либо по сессии, но не хочу, чтобы поле формы PIN повторялось, как это сделал я) и .
- Я также хочу хранить имя пользователя гостя из формы регистрации как экземпляр в модели гостя. Я хочу сохранить имя пользователя гостя и значение PIN-кода в модели гостя, чтобы иметь возможность получить профиль гостя и данные PIN-кода для Gate Pass. В результате моих проб я получаю следующие ошибки: Невозможно присвоить "'APOLLOS'": "Guest.guest_name" должен быть экземпляром "User". .
Ниже представлены мои модели:
class Guest(models.Model):
guest_name = models.OneToOneField(User, on_delete=models.CASCADE, blank=True)
pin = models.CharField(max_length=6, default='No Pin', blank=True)
def __str__(self):
return f"{self.guest_name}"
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null = True)
surname = models.CharField(max_length=20, null=True)
othernames = models.CharField(max_length=40, null=True)
gender = models.CharField(max_length=6, choices=GENDER, blank=True, null=True)
phone = PhoneNumberField()
image = models.ImageField(default='avatar.jpg', blank=False, null=False, upload_to ='profile_images',
)
def __str__(self):
return f'{self.user.username}-Profile'
class Pin(models.Model):
ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE)
value = models.CharField(max_length=6, default=generate_pin, blank=True)
added = models.DateTimeField(auto_now_add=True, blank=False)
reference = models.UUIDField(primary_key = True, editable = False, default=uuid.uuid4)
status = models.CharField(max_length=30, default='Not Activated')
#Save Reference Number
def save(self, *args, **kwargs):
self.reference == str(uuid.uuid4())
super().save(*args, **kwargs)
def __unicode__(self):
return self.ticket
class Meta:
unique_together = ["ticket", "value"]
def __str__(self):
return f"{self.ticket}"
def get_absolute_url(self):
return reverse("pin-detail", args=[str(self.id)])
Мой код Просмотров:
Прошу кого-нибудь помочь с наилучшим способом решения этой проблемы. Спасибо
Вы не можете сохранить квест как Пользователь таким образом. Сделайте что-то вроде этого. Из вашей формы получите имя пользователя. Затем создайте нового пользователя с этим именем и создайте гостя с этим новым пользователем.
//simple form --> get it in youre template
class GuestUserForm(forms.Form):
username = forms.CharField()
password=forms.CharField()
//create new user from the form in template
user_guest = form.cleaned_data.get("username")
new_user = User.objects.create_user(username=user_guest)
//create new guest with created user
Guest.objects.create(guest_name=new_user)
//youre view function
def register_guest(request):
if request.method == 'POST':
form = GuestUserForm(request.POST)
if form.is_valid():
user_guest = form.cleaned_data.get("username")
print(user_guest)
new_user = User.objects.create_user(username=user_guest)
Guest.objects.create(guest_name=new_user)
form = GuestUserForm()
return render(request, "index.html",{"form":form})