#23404: Django modelformset returns the same data inserted in the previous
insert
when opening the same page for inserting new data
-------------------------------------+-------------------------------------
Reporter: guruprasad | Owner: nobody
Type: Bug | Status: new
Component: Forms | Version: 1.6
Severity: Normal | Resolution:
Keywords: | Triage Stage:
modelformset_factory | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by guruprasad):
* needs_better_patch: => 0
* needs_tests: => 0
* needs_docs: => 0
Old 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.
New 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)
}}}
{{{
# views.py
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
})
}}}
{{{
<!--website/add.html -->
<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.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/23404#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/068.0b9ffc58300c31014c197ab793eb17ce%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.