The site I'm working on involves teachers creating student objects. The teacher can choose so that the student can log on to the site (to check calendars, etc.), Or the teacher can choose to use the student’s facility only for keeping notes and not allow the student to log in. If the teacher supplies the username and password, he must create an object of the first type - one that can log into the system, that is, a regular user object. If the teacher does not enter a username / password, he must create a second type. Another requirement is that the teacher should be able to enter later and change the student without registration to another level. What is the best development method for this scenario? Subclass User and username and password are not required? What else will it affect?
Edit:
I ended up using User.set_unusable_password (). Here is the code - I forgot other forms, etc., which I also use in my opinion:
The form
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')
Please note that username and password are not required on the form.
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']))
else:
student_form = StudentForm()
return render_to_response('priviostudio/create_student.html', {
'student_form': student_form,
})
And in the student edit view (which will probably be combined with the create_student view) I have this for 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)
And in POST, if the teacher presents a new username and a valid password, I will just install them on the user instance.
Thanks for all the ideas.