Django. Modelformset. I have a problem with id. When receiving a POST request, the ID in the records is None
Stages of the recording path:
- Before rendering the page in the view ID is
- There is an ID on the page in the browser (in form.instance.id)
- When the form is saved (submit), a POST request is sent and there is no ID in the received data in the form instances
models.py:
class WebsiteServiceBlocks(models.Model):
image = models.ImageField(upload_to='images/', null=True, blank=True)
name = models.CharField(max_length=255, null=True, blank=True)
description = models.TextField(null=True, blank=True)
form.py:
class WebsiteServiceBlocksForm(forms.ModelForm):
class Meta:
model = models.WebsiteServiceBlocks
fields = ['image', 'name', 'description']
widgets = {
'image': forms.FileInput(attrs={
'class': 'form-control-file',
}),
'name': forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Введите название услуги',
'rows': '3',
}),
'description': forms.Textarea(attrs={
'class': 'form-control',
'rows': '3',
'placeholder': 'Введите описание услуги',
}),
}
views.py:
def website_services_view(request):
# Main page block instances & forms
formset_instances = models.WebsiteServiceBlocks.objects.all()
MainPageServiceBlocksFormset = modelformset_factory(
model=models.WebsiteServiceBlocks,
form=forms.WebsiteServiceBlocksForm,
fields=('image', 'name', 'description'),
extra=0,
)
if not models.WebsiteServiceBlocks.objects.count() > 0:
models.WebsiteServiceBlocks.objects.bulk_create(
[models.WebsiteServiceBlocks() for i in range(3)]
)
block_formset = MainPageServiceBlocksFormset(
request.POST or None, request.FILES or None,
queryset=formset_instances,
prefix='service_blocks_form',
)
for form in block_formset:
form.fields['id'].required = False
# Main page SEO instance & form
website_service: models.WebsiteService = models.WebsiteService.get_solo()
if website_service.seo is None:
website_service.seo = models.SEO.objects.create()
website_service.save()
seo_form = forms.SEOForm(
request.POST or None,
instance=website_service.seo,
prefix='service_seo_form',
)
# Method POST & form-save
alerts = []
if request.method == 'POST':
if block_formset.is_valid():
for service_blocks_form in block_formset:
instance = service_blocks_form.save(commit=False)
alerts.append('Услуги сохранены успешно!')
utils.form_save(seo_form, alerts, 'Настройки SEO сохранены успешно!')
# Context packing & render
context = {
'formset': block_formset,
'seo_form': seo_form,
'alerts': alerts,
}
return render(request, 'admin/website/services.html', context)