【问题标题】:Django MultiChoiceField form invalidDjango MultiChoiceField 表单无效
【发布时间】:2020-12-05 18:53:44
【问题描述】:

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

在应用程序中,程序在特定日期运行,存储在“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')

【问题讨论】:

  • if form.is_valid: .is_valid(),否则它会在每次检查is_valid 属性是否存在时返回True。下一行:prof.programme_id = self.programme_id - 你在哪里设置 self.programme_id 属性?
  • 感谢您的收获。缺少的代码行 (programme = Programme.objects.get(slug=self.kwargs['slug'])) 已添加到 form_valid 部分。作为附加说明,如果我删除 ModelChoiceField 过滤器(因此显示所有程序的所有日期,并删除 get_form_kwargs 部分,则表单将正确保存。似乎使用过滤器,form_valid 位永远不会运行。跨度>
  • 已追踪此错误但不清楚如何解决:FORM ERRORS = >

标签: django forms modelchoicefield


【解决方案1】:

解决方案:

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'])

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')

【讨论】:

    猜你喜欢
    • 2016-10-21
    • 2013-09-14
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2017-04-27
    相关资源
    最近更新 更多