-2

我请求帮助对表格无效的原因进行排序。

在应用程序中,程序在特定日期运行,存储在“DAY”模型中。一位或多位教授可以添加到一天或多天的课程中。在 FORMS 中,我过滤了 day=ModelChoiceField 以便只有与应该添加教授的程序相关的日期可供选择。

但是在保存时,我的表格无效。非常感谢所有帮助。谢谢你。

楷模:

class Programme(models.Model):
    name = models.CharField('Programme Name', max_length=50, editable=True)
    slug = models.SlugField(unique=True, max_length=10)

class Prof(models.Model):
    programme = models.ForeignKey(Programme, on_delete=models.CASCADE)
    prof = models.ForeignKey(User, on_delete=models.CASCADE)
    day = models.ForeignKey(Day, on_delete=models.CASCADE)

class Day(models.Model):
    programme = models.ForeignKey(Programme, on_delete=models.CASCADE)
    date = models.DateTimeField(editable=True)
    start_time = models.TimeField(editable=True, blank=True, null=True)
    end_time = models.TimeField(editable=True, blank=True, null=True)

class Role(models.Model):
    role = models.CharField(max_length=50, editable=True, unique=True)

意见:

class ProfCreate(CreateView):
    model = Prof
    form_class = ProfCreateForm
    context_object_name = 'obj'
    template_name = 'programme/prof_create.html'
    extra_context = {'page_title': 'Add Prof'}
    success_url = reverse('programme:programme_detail')

    def get_form_kwargs(self):
        #pass programme_id to form modelchoicefield filter
        kwargs = super().get_form_class()
        programme = Programme.objects.get(slug=self.kwargs['slug')
        self.kwargs['programme_id'] = programme.id
        return self.kwargs

    def form_valid(self, form):
        if form.is_valid:
            prof = form.save(commit=False)
            programme = Programme.objects.get(slug=self.kwargs['slug'])
            prof.programme_id = self.programme_id
            prof.save()
        return redirect('programme:programme_detail', self.kwargs['slug'])

    def form_invalid(self, form):
        print ('FORM INVALID - - WHY?')
        return redirect('programme:programme_detail', self.kwargs['slug'])

形式:

class ProfCreateForm(ModelForm):
    #filter programme days available in day ModelChoiceField
    def __init__(self, *args, **kwargs):
        programme_id = kwargs.pop('programme_id')
        slug =kwargs.pop('slug')
        print ('id, slug', programme_id, slug)
        super(CxoCreateForm, self).__init__(*args, **kwargs)
        self.fields['day'].queryset=Day.objects.filter(programme_id=programme_id)

    prof = ModelChoiceFieldName(queryset=User.objects.filter(is_contractor=True))
    role = ModelChoiceField(queryset=Role.objects.all())
    day = ModelChoiceField(queryset=Day.objects.all())

    class Meta:
        model = Prof
        fields = ('prof', 'role', 'day')
4

1 回答 1

0

解决方案:<views.py>

class ProfCreate(CreateView):
    model = Prof
    form_class = ProfCreateForm
    context_object_name = 'prof'
    template_name = 'programme/prof_create.html'
    extra_context = {'page_title': 'CxO'}

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super(ProfCreate, self).get_form_kwargs(*args, **kwargs)
        programme =  Programme.objects.get(slug=self.kwargs['slug'])
        kwargs['programme_id'] = programme.id
        return kwargs

    def form_valid(self, form):
        if form.is_valid:
            prof = form.save(commit=False)
            programme = Programme.objects.get(slug=self.kwargs['slug'])
            prof.programme_id = programme.id
            prof.save()
        return redirect('programme:programme_detail', self.kwargs['slug'])

<forms.py>

class ProfCreateForm(ModelForm):
    def __init__(self, *args, **kwargs):
        programme_id = kwargs.pop('programme_id')
        super(ProfCreateForm, self).__init__(*args, **kwargs)
        self.fields['day'].queryset=Day.objects.filter(programme_id=programme_id)

    prof = ModelChoiceFieldName(queryset=User.objects.filter(is_contractor=True))
    role = ModelChoiceField(queryset=ProfRole.objects.all())
    day = ModelChoiceField(queryset=Day.objects.all())

    class Meta:
        model = Prof
        fields = ('prof', 'role', 'day')
于 2020-08-17T03:18:03.137 回答