Django Formset
tags :
Django View #
from django.shortcuts import render
from django.views.generic import TemplateView, FormView
from django.contrib import messages
from .forms import UploadFormSet
from .models import UploadModel
class HomePageView(TemplateView):
template_name = 'home.html'
class ChatPageView(TemplateView):
template_name = 'chat.html'
# form view to upload files
# formset with view
class UploadFileView(FormView):
template_name = 'upload.html'
form_class = UploadFormSet
success_url = '/upload/'
def form_valid(self, formset):
for form in formset:
if form.is_valid():
form.save()
messages.success(
self.request,
'Submitted successfully'
)
return super().form_valid(formset)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
formset = context['form']
formset.extra = 1 # Specify the number of extra empty forms to display
context['form'] = UploadFormSet(
queryset=UploadModel.objects.none()
)
return context
Model #
from django.db import models
class UploadModel(models.Model):
uploaded_at = models.DateTimeField(auto_now_add=True)
document = models.FileField(
upload_to='uploads/',
null=True,
blank=True,
)
web_site_url = models.URLField(
max_length=200,
blank=True,
null=True,
)
Form #
from django import forms
from .models import UploadModel
class UploadForm(forms.ModelForm):
class Meta:
model = UploadModel
fields = '__all__' # You can also specify a list of fields ['field1', 'field2']
UploadFormSet = forms.modelformset_factory(
UploadModel,
form=UploadForm, extra=1)
Template or HTML #
% extends “base.html” % % load static %
% load crispy_forms_tags %
% block content % % if messages % % for message in messages %
% endfor % % endif %Upload document or website
% block js %
% endblock %
Settings #
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
'corsheaders',
"frontend",
'crispy_forms',
'crispy_bootstrap5'
]
CRISPY_TEMPLATE_PACK ='bootstrap5'