我正在处理的网站涉及教师创建学生对象。教师可以选择让学生登录网站(查看日历等),或者教师可以选择仅将学生对象用于记录保存,而不允许学生登录。在学生创建形式,如果教师提供用户名和密码,它应该创建第一种对象 - 可以登录的对象,即常规用户对象。如果教师不提供用户名/密码,则应创建第二种类型。另一个要求是,教师应该能够晚点入学,并将非登录学生转为其他种类。设计这种情况的最佳方式是什么?子类用户并且不需要用户名和密码?这会影响到什么?Django设计问题:扩展用户使无法登录的用户
编辑: 我结束了使用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)
,并在后期,如果教师提交了新的用户名和有效的密码,我只需在User实例上进行设置。
感谢您的想法大家。
问题是我还必须生成一个随机的用户名(因为用户名有unique = True且没有空白= True),这也会显示在表单上,并且可能会让教师感到困惑。 – UrLicht 2010-05-01 20:42:55