Opened 11 years ago
Last modified 11 years ago
#23404 closed Bug
Django modelformset returns the same data inserted in the previous insert when opening the same page for inserting new data — at Initial Version
| Reported by: | Guruprasad | Owned by: | nobody |
|---|---|---|---|
| Component: | Forms | Version: | 1.6 |
| Severity: | Normal | Keywords: | modelformset_factory |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
# models.py
import datetime
from django.db import models
class Category(models.Model):
category_name = models.CharField(unique=True, max_length=100)
is_enabled = models.BooleanField(default=True)
created_date = models.DateField(default=datetime.date.today)
def __unicode__(self):
return self.category_name
class Website(models.Model):
url = models.URLField(unique=True)
site_name = models.CharField(max_length=100)
vertical_category = models.ForeignKey(Category, related_name="websites")
unique_users_per_day = models.IntegerField()
page_views_per_day = models.IntegerField()
unique_users_per_month = models.IntegerField()
page_views_per_month = models.IntegerField()
class Section(models.Model):
website = models.ForeignKey(Website, related_name="sections")
url = models.URLField(unique=True)
section_name = models.CharField(max_length=100)
# forms.py
from django import forms
from django.forms.models import modelformset_factory, BaseModelFormSet
from .models import Website, Section
class AddWebsiteForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(AddWebsiteForm, self).__init__(*args, **kwargs)
self.fields['unique_users_per_day'].widget = forms.TextInput()
self.fields['page_views_per_day'].widget = forms.TextInput()
self.fields['unique_users_per_month'].widget = forms.TextInput()
self.fields['page_views_per_month'].widget = forms.TextInput()
self.fields['vertical_category'].empty_label = "Vertical Category"
class Meta:
model = Website
exclude = []
class AddSectionForm(forms.ModelForm):
class Meta:
model = Section
exclude = ['website',]
class FirstRequiredFormSet(BaseModelFormSet):
def __init__(self, *args, **kwargs):
super(FirstRequiredFormSet, self).__init__(*args, **kwargs)
for form in self.forms:
form.empty_permitted = False
AddSectionFormSet = modelformset_factory(Section, AddSectionForm, formset=FirstRequiredFormSet)
from django.shortcuts import render, redirect
from django.core.urlresolvers import reverse_lazy
from django.forms.formsets import INITIAL_FORM_COUNT
from .forms import AddWebsiteForm, AddSectionFormSet
def add_website(request):
import pdb; pdb.set_trace()
if request.method == "POST":
website_form = AddWebsiteForm(request.POST)
section_formset = AddSectionFormSet(request.POST)
if website_form.is_valid() and section_formset.is_valid():
website = website_form.save()
sections = section_formset.save(commit=False)
for section in sections:
section.website = website
section.save()
if 'add_another' in request.POST:
return redirect(reverse_lazy('login'))
else:
return redirect(reverse_lazy('login'))
else:
website_form = AddWebsiteForm()
section_formset = AddSectionFormSet()
return render(request,
"website/add.html",
{
"website_form" : website_form,
"section_formset": section_formset
})
<form action="" method="post">
<div>
{{ website_form }}
</div>
<div>
{{ section_formset }}
</div>
<input type="submit" value="submit">
After submitting the form for the first time and inserting some data, I visit the same URL for inserting more data. But the form of section formset is pre-populated with the data inserted the previous time.
Note:
See TracTickets
for help on using tickets.