模型.py
class Major(models.Model):
major = models.CharField(max_length=50, unique=True)
description = models.TextField()
image = models.ImageField(default='default_pics/default_major.jpg', upload_to='major_pics')
class Teacher(models.Model):
image = models.ImageField(default='default_pics/default_teacher.jpg', upload_to='teacher_pics')
interest = models.TextField(blank=True,null=True)
major = models.ForeignKey(Major, on_delete=models.SET_NULL, null=True)
user = models.OneToOneField(MyUser, on_delete=models.CASCADE)
表格.py
class TeacherProfileCreationForm(forms.ModelForm):
class Meta:
model = Teacher
fields = ['major', 'image']
help_texts = {
'image': 'If you do not set any image, one will be set automatically for this teacher upon creation.'
}
views.py
@login_required
def teacher_create_view(request):
if request.method == 'POST':
u_form = TeacherUserCreationForm(request.POST)
t_form = TeacherProfileCreationForm(request.POST, request.FILES)
if u_form.is_valid and t_form.is_valid():
u_form.save()
t_form.save(commit=False)
email = u_form.cleaned_data.get('email')
user = MyUser.objects.get(email=email)
t_form.instance.user = user
t_form.save()
teacher = Teacher.objects.get(user__email=email)
messages.success(request, f'A teacher has been added!')
return redirect('teacher-detail', teacher.id)
else:
u_form = TeacherUserCreationForm()
t_form = TeacherProfileCreationForm()
context = {'u_form': u_form, 't_form': t_form,
'list_url':list_url,'list_title':list_title, 'detail_title': detail_title}
return render(request, 'users/teacher_create_update_form.html', context)
测试.py
class TestTeacher(TestCase):
def setUp(self):
self.client = Client()
self.major = Major.objects.create(
major='Test Major',
description='Foo bar',
)
self.teacher_user = User.objects.create(
email="[email protected]",
full_name="Test Teacher 1",
is_teacher=True
)
self.teacher = Teacher.objects.create(
major=self.major,
user=self.teacher_user
)
self.teacher_create = reverse('teacher-create')
def test_teacher_create(self):
response = self.client.post(self.teacher_create, {
'email': '[email protected]',
'full_name': "Test Teacher 2",
'password1': '@DylanBergmanN1!',
'password2': '@DylanBergmanN1!',
'major': self.major # The error is most probably right here
})
print(response.context['t_form'].errors)
终端中的错误消息
<ul class="errorlist"><li>major<ul class="errorlist"><li>Select a valid choice. That choice is not one of the available choices.</li></ul></li></ul>
基本上我正在尝试测试这个创建视图,当我将主视图传递给视图时,它说我必须选择一个有效的选择,但我如何才能为 OneToOneField 正确地做到这一点?我试过 {'major':self.major.major}, {'major': 'Test Major'}, {'major':[self.major]}, {'major':['Test Major']},等等,但他们都没有工作。请帮帮我!提前谢谢你。
错误不在
OneToOneField
,而是在major
ForeignKey
字段。当您使用 Django 测试客户端发送原始 POST 数据时,您需要对作为外键的字段使用主键。
所以:
response = self.client.post(self.teacher_create, {
'email': '[email protected]',
'full_name': "Test Teacher 2",
'password1': '@DylanBergmanN1!',
'password2': '@DylanBergmanN1!',
'major': self.major.pk
})