Как автоматически создать пользователя в 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, чтобы подключить функции.
Это можно сделать несколькими способами, самый простой из которых -
- Создайте пользователя с помощью
django.contrib.auth.models User Model
, установитьUser.password = default_password
User.groups= default_password
. - Установите
User.is_active = false
,user.groups.add(name='groupname')
затемUser.save()
его .
- В панели администратора перечислите все
in_active Employee/User
- определите функцию
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'. Это не позволит пользователю войти в систему.