OneToOneField 上的“选择一个有效的选择。该选择不是可用的选择之一”错误

问题描述 投票:0回答:1

模型.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']},等等,但他们都没有工作。请帮帮我!提前谢谢你。

django django-forms django-testing django-tests
1个回答
0
投票

错误不在

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
})
© www.soinside.com 2019 - 2024. All rights reserved.