Сайт, над которым я работаю, включает учителей, создающих объекты учеников. Учитель может сделать так, чтобы ученик мог войти на сайт (проверить календари и т. Д.), ИЛИ учитель может использовать объект ученика только для ведения учета и не разрешать ученику войти в систему. При создании ученика Если учитель вводит имя пользователя и пароль, он должен создать объект первого типа - тот, который может войти в систему, то есть обычный объект пользователя. Если учитель не предоставляет имя пользователя / пароль, он должен создать второй тип. Другое требование состоит в том, что учитель должен быть в состоянии прийти позже и сменить учащегося, не входящего в систему, на другой вид. Каков наилучший способ дизайна для этого сценария? Подкласс пользователя и сделать имя пользователя и пароль не требуется? На что еще это повлияет?
Edit:
В итоге я использовал User.set_unusable_password (). Вот код - я пропустил другие формы и т. Д., Которые я также использую в моем представлении:
Форма
class StudentForm(forms.ModelForm):
username = forms.RegexField(regex=r'^\w+$',
required=False,
max_length=30,
label=("Username"),
error_messages={ 'invalid': ("This value must contain only letters, numbers and underscores.") })
password = forms.CharField(widget=forms.PasswordInput(),
label="Password", required=False)
class Meta:
model = User
fields = ('first_name', 'last_name', 'username', 'email', 'password')
Обратите внимание, что имя пользователя и пароль не требуются в форме.
View
def create_student(request):
if request.method == "POST":
student_form = StudentForm(request.POST)
if student_form.is_valid():
user = student_form.save(commit=False)
if student_form.cleaned_data['username'] == '':
user.username = generate_random_username()
user.set_unusable_password()
else:
user.set_password(user.password)
user.save()
return HttpResponseRedirect(reverse('student_list', args=['active']))
#GET an empty form
else:
student_form = StudentForm()
return render_to_response('priviostudio/create_student.html', {
'student_form': student_form,
})
И для редактирования студента (который, вероятно, будет объединен с представлением create_student) у меня есть это для GET:
student_form_initial = {
'username': user_instance.username if user_instance.has_usable_password() else '',
'password': user_instance.password if user_instance.has_usable_password() else '',
}
student_form = StudentForm(instance=user_instance, initial=student_form_initial)
А в POST, если учитель отправит новое имя пользователя и действительный пароль, я просто установлю их в экземпляре User.
Спасибо за идеи всем.