Hello Devs, In this Post I'm gonna show you how can we submit two django forms at once and this is also called django inline forms, for example I have two forms one is for Question and another one is for Answers, and I want a inline form, like one question and that question have four answers, ok so let's see how can we do that.
Source Code:- https://github.com/ShivamRohilllaa/django-formset
Original Post:- https://www.webdevcodes.com/django/django-formset-submit-two-django-forms-at-once/
First of all create two tables in models.py:
class Question(models.Model): text = models.CharField(max_length=200, unique=True) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return str(self.text) #Reverse relationship def get_answers(self): return self.answers.all() class Answer(models.Model): text = models.CharField(max_length=200, verbose_name='Answer') correct = models.BooleanField() question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers') created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"question {self.question.text}, answer: {self.text}. correct: {self.correct}"
Now create modelforms in forms.py:
from django.forms.models import modelformset_factory class QuestionsForm(forms.ModelForm): text = forms.CharField(label='Question', required=True) class Meta: model = Question fields = ['text'] AnswerFormset = modelformset_factory( Answer, fields=('text', 'correct'), extra=4, widgets={ 'text': forms.TextInput(attrs={ 'class': 'form-control','placeholder': 'Enter Answer here'} ) } )
import modelformset_factory then use modelformset_factory this in that form in which you want to show extra fields. for example one question have multiple answers, so we modelformset_factory in answer form
Now create views for that forms.
def add_questions(request): ques= QuestionsForm() formset = AnswerFormset(queryset=Answer.objects.none()) if request.method=='POST': ques= QuestionsForm(request.POST) formset = AnswerFormset(request.POST) if ques.is_valid() and formset.is_valid(): ques = ques.save() for form in formset: answer = form.save(commit=False) answer.question = ques answer.save() return redirect('home') return render(request, "add-ques.html", {'ques':ques, 'formset':formset}) def home(request): ques = Question.objects.all() context = {'ques':ques} return render(request, 'index.html', context)
Now render that form in your template
<form action="." method='post'> {% csrf_token %} {% for field in ques %} <div class="form-group"> <label for="text">{{field.label}}:</label> {{field}} </div> {% endfor %} {% comment %} {{ques}} {{formset}} {% endcomment %} {{ formset.management_form }} {% for field in formset %} <div class="form-group mt-5 mb-5"> <label for="text">{{field.label}}</label> {{field.text}} </div> {% endfor %} <button type="submit" class="btn btn-primary">Submit</button> </form>
that's it and this is how your form look like
Source Code:- https://github.com/ShivamRohilllaa/django-formset
Thank you
Shivam Rohilla Python Developer
Top comments (0)