我请求帮助对表格无效的原因进行排序。
在应用程序中,程序在特定日期运行,存储在“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')