Как автоматически создать пользователя в django

Я пытаюсь создать форму заявки, чтобы люди, желающие работать у нас, могли подать заявку в нашу организацию. Я поговорил со своим клиентом, и он не хочет, чтобы новые сотрудники создавали свои собственные данные для входа в систему. Вместо этого он хочет, чтобы я создал страницу администратора, на которой он будет принимать или отклонять кандидатов. Если он примет кандидата, то автоматически создаст информацию для входа в систему и отправит ее по электронной почте. Пользователь, конечно, сможет изменить свой логин, как только войдет в свой аккаунт. Как это можно сделать?

Я пытался создать регистрационный лист, но в результате пользователь создавался до того, как администратор принимал кандидата.

User = get_user_model()
class InterpreterCreationForm(UserCreationForm):
    address = forms.CharField(widget=forms.Textarea)
    phone_number = forms.CharField(max_length=15)
    ssn = forms.CharField(max_length=15, required=False)
    languages = forms.ModelMultipleChoiceField(queryset=Language.objects.all(), widget=forms.CheckboxSelectMultiple)

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')

    def save(self, commit=True):
        user = super().save(commit=False)
        user.is_interpreter = True
        if commit:
            user.save()
            interpreter = Interpreter(
                user=user,
                address=self.cleaned_data['address'],
                phone_number=self.cleaned_data['phone_number'],
            )
            interpreter.save()
            interpreter.languages.set(self.cleaned_data['languages'])
        return user

Вы работаете с моделью пользователя, поэтому при сохранении создается пользователь. Не думаю, что с этим можно что-то поделать.

Я бы создал свою собственную модель, которая подражает модели Usermodel. Эта модель будет иметь две функции: Delete и ConvertToUser.

Вам нужно будет создать два отдельных View, чтобы подключить функции.

Это можно сделать несколькими способами, самый простой из которых -

  1. Создайте пользователя с помощью django.contrib.auth.models User Model, установить User.password = default_password User.groups= default_password.
  2. Установите User.is_active = false, user.groups.add(name='groupname') затем User.save() его
  3. .
  4. В панели администратора перечислите все in_active Employee/User
  5. определите функцию def activate_employee на активную applicant\Employee из Admin panel т.е. принимает заявителя, затем create user login info, и email that applicant their login info.

если вы хотите добавить дополнительное поле в User, создайте модель UserProfie/Interpreter и определите OneToOne отношение с django.contrib.auth User Model

model.py

class Interpreter(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone = models.CharField(verbose_name="phone number", max_length=10)
    birthdate = models.DateField(verbose_name="birth date")
    gender = models.CharField(choices=GENDER_CHOICES, default=2, max_length=10)
    age = models.IntegerField(blank=True, null=True)
    # address = models.ForeignKey(to=Address, on_delete=models.CASCADE)
    created_date = models.DateTimeField(auto_now_add=True, editable=False)
    modified_date = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'interpreter'

Теперь импортируйте обе модели в from.py django.contrib.auth User Model и Interpreter model в Form,

В вашем файле forms.py

class InterpreterCreationForm(UserCreationForm):
    address = forms.CharField(widget=forms.Textarea)
    phone_number = forms.CharField(max_length=15)
    ssn = forms.CharField(max_length=15, required=False)
    languages = forms.ModelMultipleChoiceField(queryset=Language.objects.all(), widget=forms.CheckboxSelectMultiple)
    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')

    def save(self, commit=True):
        user = super().save(commit=False)
        user.is_interpreter = True
        if commit:
            user.is_inactive= False
        # Generate password for user
            user.password = 'default_password'
        # you can crate a group for new employees
            user.group.add('new_employees') 
        # then save user  
            user.save()
        # user we just save is inactive user with default_password, which will not able to login. 
            interpreter = Interpreter(
                user=user,
                address=self.cleaned_data['address'],
                phone_number=self.cleaned_data['phone_number'],
            )
           interpreter.save()
           interpreter.languages.set(self.cleaned_data['languages'])
         return user
    

Убедитесь, что при создании нового пользователя вы установили 'is_active= False'. Это не позволит пользователю войти в систему.

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