我正在處理的網站涉及教師創建學生對象。教師可以選擇讓學生登錄網站(查看日曆等),或者教師可以選擇僅將學生對象用於記錄保存,而不允許學生登錄。在學生創建形式,如果教師提供用戶名和密碼,它應該創建第一種對象 - 可以登錄的對象,即常規用戶對象。如果教師不提供用戶名/密碼,則應創建第二種類型。另一個要求是,教師應該能夠晚點入學,並將非登錄學生轉爲其他種類。設計這種情況的最佳方式是什麼?子類用戶並且不需要用戶名和密碼?這會影響到什麼?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