So here it is, my daily Problem;-)
let’s take this model:
class Employments(models.Model):
employee = models.ForeignKey(Employees, on_delete=models.CASCADE)
status = models.CharField(max_length=50)
work_time_model = models.CharField(max_length=50)
weekly_hours = models.FloatField(default=41)
percent = models.FloatField(default=100)
duty_begin = models.DateField()
duty_end = models.DateField(null=True, blank=True)
keep_data = models.BooleanField(default='0')
which can be populated by this form:
class EmploymentsForm(ModelForm):
class Meta:
model = Employments
fields = '__all__'
employee = forms.CharField(widget=forms.HiddenInput)
status = forms.ModelChoiceField(queryset=Status.objects.all(),
empty_label="Status",
required=False,
label='Status',
widget=forms.Select(attrs={
'class': "form-select border border-1 border-black text-center"
"fw-bold m-1",
'required': 'True',
}))
work_time_model = forms.ModelChoiceField(queryset=ArbeitszeitModell.objects.all(),
# empty_label="Arbeitszeitmodell",
label='Arbeitszeitmodell',
required=False,
widget=forms.Select(attrs={
'class': "form-select border border-1 border-black "
"text-center fw-bold m-1",
'required': 'True',
}))
weekly_hours = forms.FloatField(label='Wochenarbeitszeit(h)', required=False, widget=forms.NumberInput(attrs={
'class': "form-control border border-1 border-black fw-bold text-center m-1",
'placeholder': 'Wochenarbeitszeit(h)',
'required': 'True',
}))
percent = forms.FloatField(label='Prozent(%)', required=False, widget=forms.NumberInput(attrs={
'class': "form-control border border-1 border-black fw-bold text-center m-1",
'placeholder': 'Prozent',
'required': 'True',
}))
duty_begin = forms.DateField(label='Diensteintritt', required=False, widget=forms.DateInput(attrs={
'class': "form-control border border-1 border-black text-center fw-bold m-1",
'placeholder': 'Diensteintritt',
'title': 'Diensteintritt',
'type': 'text',
'onfocus': "(this.type = 'date')",
'required': 'True',
}))
duty_end = forms.DateField(label='Dienstende', required=False, widget=forms.DateInput(attrs={
'class': "form-control border border-1 border-black text-center fw-bold m-1",
'placeholder': 'Dienstende',
'title': 'Dienstende',
'type': 'text',
'onfocus': "(this.type = 'date')",
}))
KEEP_DATA_CHOICES = (
["True", "Ja"],
["False", "Nein"],
)
keep_data = forms.BooleanField(label='Daten behalten?', required=False,
widget=forms.RadioSelect(choices=KEEP_DATA_CHOICES, attrs={
'class': 'border border-black border-1 rounded-2 bg-secondary-subtle m-1',
'required': 'True',
}))
def clean_duty_end(self):
duty_end = self.cleaned_data['duty_end'] if self.cleaned_data['duty_end'] else None
return duty_end
Code for creating and altering dataset is here:
...
if 'save_form' in request.POST:
id_alter = request.POST['id']
employee = Employees.objects.get(pk=id_alter)
if 'save_work' in request.POST:
form = EmploymentsForm(request.POST)
if form.is_valid():
form.save()
context['success'] = 'Dataset succesfully created'
else:
context['error'] = 'error'
if 'update_work' in request.POST:
form = EmploymentsForm(request.POST, instance=employee)
if form.is_valid():
form.save()
context['success'] = 'Dataset updated succesfully'
else:
context['error'] = 'error'
...
so “save_work” creates a dataset successfully, but “update_work” doesn’t…but delivers the “success” message, so “if form.is_valid” has been passed without error message. But the data is simply not updated in database.
If i print the form.cleaned_data of “update_work” it looks ok to me…:
{'employee': '1', 'status': <Status: Soldat (BS)>, 'work_time_model': <ArbeitszeitModell: Vollzeit>, 'weekly_hours': 12.0, 'percent': 12.0, 'duty_begin': datetime.date(2023, 8, 24), 'duty_end': datetime.date(2023, 8, 31), 'keep_data': True}