私が取り組んでいるサイトには、教師が生徒のオブジェクトを作成することが含まれています。教師は、生徒がサイトにログインできるようにする(カレンダーなどを確認する)か、生徒のオブジェクトを記録保持のみに使用し、生徒にログインを許可しないようにするかを選択できます。生徒の作成フォームでは、教師がユーザー名とパスワードを提供する場合、第1種のオブジェクト、つまりログインできるオブジェクト、つまり通常のUserオブジェクトを作成する必要があります。教師がユーザー名/パスワードを提供しない場合は、2番目のタイプを作成する必要があります。もう1つの要件は、教師が後で参加して、ログインしていない生徒を別の種類に変更できるようにすることです。このシナリオを設計するための最良の方法は何ですか?ユーザーをサブクラス化し、ユーザー名とパスワードを不要にしますか?これは他に何に影響しますか?
編集: 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')
フォームにユーザー名とパスワードは必要ありません。
意見
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インスタンスに設定するだけです。
みんなのアイデアをありがとう。