Как автоматически создать профиль для гостевого пользователя при активации PIN-кода

Я работаю над приложением для продажи билетов на мероприятия на Django, где гостю потребуется подтвердить PIN-код пополнения счета на портале для бронирования или резервирования места на мероприятии, для которого он купил PIN-код. И я также хочу, чтобы эти гости были аутентифицированы, чтобы я мог управлять авторизацией и на них.

В моих моделях у меня есть модель профиля, где я использую сигналы для автоматического создания профиля пользователя при создании администратором пользователя, и у меня также есть три группы пользователей в форме создания нового пользователя с соответствующими привилегиями; Организатор, Персонал и Гость - это группы. Я также разработал класс Django CreateUserForm, используя модуль UserCreationForm в моем forms.py, где у меня есть выпадающий список всех этих групп для администратора, чтобы добавить пользователей (страница регистрации доступна только администратору), используя панель администратора.

Моя проблема в том, что я хочу, чтобы каждый PIN-код, который подтвержден гостем, мог создать свой профиль сразу с PIN-кодом, подтвержденным с помощью сигналов, но я не знаю, как это сделать.

Я запутался в своем классе CreateUserForm, поскольку все группы перечислены в Drop down. Не знаю, как использовать условия внутри формы, чтобы определить, является ли это PIN активация от гостя, чтобы группа Guest была единственной опцией, и как только это будет Admin, все группы пользователей будут заполнены.

Ниже приведен код моей модели профиля:

GENDER = (
('Male', 'Male'),
('Female', 'Female'),
)
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', 

)

Вот код моей формы создания пользователя:

class CreateUserForm(UserCreationForm):
    email = forms.EmailField
    group = forms.ModelChoiceField(queryset=Group.objects.all(),
                               required=True)

class Meta:
    model = User
    fields = ['username', 'email', 'password1', 'password2', 'group']

Вот моя активация пинов в файле views.py:

def pin_activation(request):

if request.method == "POST":
    
    #Create new form with name form
    form = PinActivationForm(request.POST)

    #Check if the the form has valid data in it
    if form.is_valid():

        #Check the status of the user Pin with the one in the Database
        check_pin_status = Pin.objects.filter(value=form['pin'].value(), status='Not Activated')

        #Check with the Status of the Pin is Right
        if check_pin_status:

            #Update the User Pin with a new status
            Pin.objects.filter(value=form['pin'].value()).update(status='Activated')
            #Message the User
            messages.success(request, 'Pin Activated Successfully')
            #Redirect the user
            return redirect('user-register')
 
        else:
            messages.error(request, 'Pin Already Activated.You are Logged In.')
            return redirect('guest-index')
    else:
        messages.error(request, 'Something Went Wrong. Try again')
else:
    form = PinActivationForm()
context = {
    'form':form,
}
return render(request, 'user/pin_activation.html', context)

Кто-нибудь должен любезно помочь с наилучшим способом решения такого рода проблемы. Спасибо

Я смог решить эту проблему, добавив форму регистрации сразу после действия pin, чтобы гость регистрировался, используя пользователя и пароль, а затем, используя тот же сигнал профиля, автоматически создавался профиль guess. Вот код:

def pin_activation(request):

if request.method == "POST":
    
    #Create new form with name form
    form = PinActivationForm(request.POST)

    #Check if the the form has valid data in it
    if form.is_valid():

        #Check the status of the user Pin with the one in the Database
        check_pin_status = Pin.objects.filter(value=form['pin'].value(), status='Not Activated')

        #Check if the PIN is correct and NOT ACTIVATED
        if check_pin_status:

            #Update the User Pin with a new status of Activated
            Pin.objects.filter(value=form['pin'].value()).update(status='Activated')
            #Message the User
            messages.success(request, 'Pin Activated Successfully')
            #Redirect the user
            return redirect('register-guest')
 
        elif Pin.objects.filter(value=form['pin'].value(), status="Activated"):
            messages.error(request, 'Pin Already Activated.')
            return redirect('user-profile-update')
        else:
            messages.error(request, "Invalid PIN")
            return redirect('user-login')
            
               
    else:
        messages.error(request, 'Something Went Wrong. Try again')
else:
    form = PinActivationForm()
context = {
    'form':form,
}
return render(request, 'user/pin_activation.html', context)

Функция регистрации гостей

def register_guest(request):
#Create variable and query all users
workers = User.objects.all()
page_title = "Event Guest Register"
if request.method == 'POST':
    form = GuestUserForm(request.POST)
    if form.is_valid():
        form.save()
        messages.success(request, 'Registered Successfully.')
        return redirect('dashboard-index')
else:
    form = GuestUserForm()
context = {
    'form':form,
    'workers':workers,
    'page_title':page_title,
}
return render(request, 'user/register.html', context)

Форма регистрации гостя в forms.py

class GuestUserForm(UserCreationForm):
email = forms.EmailField
#Get Guest Group from DB
group = forms.ModelMultipleChoiceField(
    queryset=Group.objects.filter(name='Guest'),
    initial=Group.objects.filter(name='Guest'),
    disabled=True
)


class Meta:
    model = User
    fields = ['username', 'email', 'password1', 'password2', 'group']

Моя PIN-модель

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=20, 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} | {self.value}"

Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что каждый раз, когда гость активирует пин, но не может продолжить регистрацию или не заполняет регистрационную форму и выходит из системы или закрывает браузер, его/ее пин показывает Pin Already Activated, а поскольку я использую декоратор Login Required в функции Update Profile Function, ему/ей не разрешается обновить свой профиль, потому что он/она еще не является пользователем, хотя функция активации перенаправляет гостя на обновление профиля.

Какова логика, которая позволит убедиться, что любая PIN активация без регистрации пользователя еще не является действительной PIN активацией, или какое лучшее решение для этого случая использования.

Вернуться на верх