I asking for help sorting the reason for the form being invalid.
In the application, Programmes run on specific dates, stored in the 'DAY' model. One or more Profs may be added to one or more days of a programme. In FORMS, I've filtered the day=ModelChoiceField so that only the dates related to the programme to which the prof should be added are available for selection.
However on save, I'm getting a form invalid. All help much appreciated. Thank you.
Models:
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)
Views:
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'])
Forms:
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')