【发布时间】: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