BUG USING modelformset_factory MODULE

31 views
Skip to first unread message

Michael Maina

unread,
Jan 22, 2023, 2:49:01 PM1/22/23
to Django users

Hello,

 

I have a challenge using the modelformset_factory module (https://docs.djangoproject.com/en/3.2/topics/forms/modelforms/) and invite your advice. 

 

I can automatically generate a pre-populated webpage with a select dataset from the database, but the generated template creates two sets of fields on my form. One entry has the pre-populated dataset, while the second set is blank.

 The challenge is any attempt to update the retrieved dataset, leads to the creation of a new (unnecessary) entry in my database. Any assistance on how to resolve this is most welcome. Details of my setup are highlighted below: 

A)     PIP FREEZE 

(tickets) michael@Data-Wrangler tickets % pip freeze           

asgiref==3.5.2

backports.zoneinfo==0.2.1

certifi==2022.6.15

charset-normalizer==2.0.12

crispy-bootstrap5==0.6

Django==3.2.13

django-cors-headers==3.10.1

Django-crispy-forms==1.14.0

django-webpack-loader==1.6.0

djangorestframework==3.13.1

idna==3.3

image==1.5.33

importlib-resources==5.4.0

pdfkit==1.0.0

phonenumbers==8.12.51

Pillow==9.2.0

PyQRCode==1.2.1

pytz==2022.1

requests==2.27.1

six==1.16.0

sqlparse==0.4.2

typing_extensions==4.1.1

urllib3==1.26.9

uWSGI==2.0.20

zipp==3.6.0

(tickets) michael@Data-Wrangler tickets % 

 B)      VIEW 

@login_required
def eventupdate(request, event_id):
try:
status = ClientProfile.objects.filter(username=str(request.user).strip()).values('operational')
except:
status = False
if (status[0]['operational']) != True:
return render(request, 'website/dashboard.html')
context = {}
ProductFormSet = modelformset_factory(Product, fields = ('name', 'image', 'visible' , 'brief', 'details', 'venue', 'date', 'time', 'promoters', 'advance_ticket', 'gate_ticket','regular_ticket', 'vip_ticket','under18_ticket',))

if request.method == 'POST':
formset = ProductFormSet(request.POST, request.FILES, queryset=Product.objects.filter(pk=int(event_id)))

if formset.is_valid():
formset.save()
return HttpResponseRedirect(reverse('website-store'))
else:

formset = ProductFormSet(queryset=Product.objects.filter(pk=int(event_id)))

return render(request, template_name='website/eventupdate.html', context={'formset': formset, 'status': status, 'event': event_id })



  1. TEMPLATE

 

{% extends "website/base_portal.html" %}
{% block title %} EVENT UPLOAD - EVENTS MAURITIUS {% endblock %}
{% block content %}
{% load crispy_forms_tags %}
{% load static %}
<div class="search">
<div class="search-update px-5">
<div class="box-element border-0 rounded-lg mt-0 px-5 py-4">
<h4 class="text-center">UPDATE&nbsp;AN&nbsp;EXISTING&nbsp;EVENT</h4>

<form method="post" enctype="multipart/form-data" name="eventUpload">

{% csrf_token %}
{{ formset | crispy }}

<div class="validation-feedback" id="event-validation"></div>
<button class="btn btn-primary mx-auto rounded-pill btn-checkout" type="submit" id="submitEventProfile">Update Event Details</button>
</form>
</div>
</div>
</div>
</div>
<script type="text/javascript">
const event = {{event}}
//document.getElementsByClassName("multiField").style.display = "hidden";
//document.getElementByClassName("multiField").style.visibility = "none";
//$("multiField").remove();
</script>
{% endblock %}

 

  1. MODEL

 

class Product(models.Model):
name = models.CharField(max_length=1000 , blank=True, null=True, help_text="Full name of the event")
price = models.DecimalField(max_digits=7, decimal_places=2, default=0)
digital = models.BooleanField(default=False, null=True, blank=True)
image = models.ImageField(upload_to='store/', null=True, blank=True)
portfolio = models.ForeignKey(ProductImage, on_delete=models.SET_NULL, null=True, blank=True)
#category = models.ForeignKey(ProductCategory, on_delete=models.SET_NULL, null=True, blank=True)
#tag = models.ManyToManyField(ProductTag)
venue = models.CharField(max_length=200, blank=True, null=True)
promoters = models.CharField(max_length=200, blank=True, null=True)
brief = models.CharField(max_length=200, blank=True, null=True, help_text="A brief description of the event")
details = models.TextField(blank=True, null=True, help_text="Separate each line with a fullstop and leave the last line empty")
advance_ticket_deadline = models.PositiveIntegerField(default=0)
advance_ticket = models.PositiveIntegerField(default=0)
gate_ticket = models.PositiveIntegerField(default=0)
regular_ticket = models.PositiveIntegerField(default=0)
vip_ticket = models.PositiveIntegerField(default=0)
under18_ticket = models.PositiveIntegerField(default=0)
date = models.DateField(blank=False, null=False, default=timezone.now)
time = models.CharField(blank=True, null=True, max_length=20)
visible = models.BooleanField(default=False, help_text="Select this field to activate this event on the home page")

def __str__(self):
return self.name
class Meta:
ordering = ['date']
dayOfWeek = {0:'MON', 1:'TUE', 2:'WED', 3:'THU', 4:'FRI', 5:'SAT', 6:'SUN'}
monthOfYear = {1:'JAN', 2:'FEB', 3:'MAR', 4:'APR', 5:'MAY', 6:'JUN', 7:'JUL', 8:'AUG', 9:'SEP', 10:'OCT', 11:'NOV', 12:'DEC'}

@property
def imageURL(self):
try:
url = self.image.url

 

 

  1. DUPLICATED HTML

 

<div class="multiField">







<div id="div_id_form-0-name" class="mb-3"> <label for="id_form-0-name" class="form-label">


Name


</label> <input type="text" name="form-0-name" value="BERNACHE BEACH SHOW" maxlength="1000" class="textinput textInput form-control" id="id_form-0-name"> <small id="hint_id_form-0-name" class="form-text text-muted">Full name of the event</small> </div> <div id="div_id_form-0-image" class="mb-3"> <label for="id_form-0-image" class="form-label">


Image


</label> <div class=" mb-2"> <div class="input-group mb-2"> <span class="input-group-text">Currently</span> <div class="form-control d-flex h-auto"> <span class="text-break" style="flex-grow:1;min-width:0"> <a href="/uploads/store/bernache_VfSjPGz.jpg">store/bernache_VfSjPGz.jpg</a> </span> <span class="align-self-center ml-2"> <span class="form-check"> <input type="checkbox" name="form-0-image-clear" id="form-0-image-clear_id" class="form-check-input" > <label class="form-check-label mb-0" for="form-0-image-clear_id">Clear</label> </span> </span> </div>


</div>





<div> <input type="file" name="form-0-image" class="form-control" accept="image/*" id="id_form-0-image"> </div>





</div> </div> <div class="mb-3"> <div id="div_id_form-0-visible" class="mb-3"> <input type="checkbox" name="form-0-visible" class="checkboxinput form-check-input" id="id_form-0-visible" checked> <label for="id_form-0-visible" class="form-check-label">


Visible


</label> <small id="hint_id_form-0-visible" class="form-text text-muted">Select this field to activate this event on the home page</small> </div> </div> <div id="div_id_form-0-brief" class="mb-3"> <label for="id_form-0-brief" class="form-label">


Brief


</label> <input type="text" name="form-0-brief" value="BEACH PARTY" maxlength="200" class="textinput textInput form-control" id="id_form-0-brief"> <small id="hint_id_form-0-brief" class="form-text text-muted">A brief description of the event</small> </div> <div id="div_id_form-0-details" class="mb-3"> <label for="id_form-0-details" class="form-label">


Details


</label> <textarea name="form-0-details" cols="40" rows="10" class="textarea form-control" id="id_form-0-details">


Dress code - All White. To a new year</textarea> <small id="hint_id_form-0-details" class="form-text text-muted">Separate each line with a fullstop and leave the last line empty</small> </div> <div id="div_id_form-0-venue" class="mb-3"> <label for="id_form-0-venue" class="form-label">


Venue


</label> <input type="text" name="form-0-venue" value="Port louis" maxlength="200" class="textinput textInput form-control" id="id_form-0-venue"> </div> <div id="div_id_form-0-date" class="mb-3"> <label for="id_form-0-date" class="form-label requiredField">


Date<span class="asteriskField">*</span> </label> <input type="text" name="form-0-date" value="2023-01-01" class="dateinput form-control" id="id_form-0-date"><input type="hidden" name="initial-form-0-date" value="2023-01-01" id="initial-form-0-id_form-0-date"> </div> <div id="div_id_form-0-time" class="mb-3"> <label for="id_form-0-time" class="form-label">


Time


</label> <input type="text" name="form-0-time" value="2100H" maxlength="20" class="textinput textInput form-control" id="id_form-0-time"> </div> <div id="div_id_form-0-promoters" class="mb-3"> <label for="id_form-0-promoters" class="form-label">


Promoters


</label> <input type="text" name="form-0-promoters" value="Live &amp; Direk Entertainment" maxlength="200" class="textinput textInput form-control" id="id_form-0-promoters"> </div> <div id="div_id_form-0-advance_ticket" class="mb-3"> <label for="id_form-0-advance_ticket" class="form-label requiredField">


Advance ticket<span class="asteriskField">*</span> </label> <input type="number" name="form-0-advance_ticket" value="0" min="0" class="numberinput form-control" id="id_form-0-advance_ticket"> </div> <div id="div_id_form-0-gate_ticket" class="mb-3"> <label for="id_form-0-gate_ticket" class="form-label requiredField">


Gate ticket<span class="asteriskField">*</span> </label> <input type="number" name="form-0-gate_ticket" value="5000" min="0" class="numberinput form-control" id="id_form-0-gate_ticket"> </div> <div id="div_id_form-0-regular_ticket" class="mb-3"> <label for="id_form-0-regular_ticket" class="form-label requiredField">


Regular ticket<span class="asteriskField">*</span> </label> <input type="number" name="form-0-regular_ticket" value="0" min="0" class="numberinput form-control" id="id_form-0-regular_ticket"> </div> <div id="div_id_form-0-vip_ticket" class="mb-3"> <label for="id_form-0-vip_ticket" class="form-label requiredField">


Vip ticket<span class="asteriskField">*</span> </label> <input type="number" name="form-0-vip_ticket" value="10000" min="0" class="numberinput form-control" id="id_form-0-vip_ticket"> </div> <div id="div_id_form-0-under18_ticket" class="mb-3"> <label for="id_form-0-under18_ticket" class="form-label requiredField">


Under18 ticket<span class="asteriskField">*</span> </label> <input type="number" name="form-0-under18_ticket" value="0" min="0" class="numberinput form-control" id="id_form-0-under18_ticket"> </div> <input type="hidden" name="form-0-id" value="7" id="id_form-0-id">





</div>





<div class="multiField">







<div id="div_id_form-1-name" class="mb-3"> <label for="id_form-1-name" class="form-label">


Name


</label> <input type="text" name="form-1-name" maxlength="1000" class="textinput textInput form-control" id="id_form-1-name"> <small id="hint_id_form-1-name" class="form-text text-muted">Full name of the event</small> </div> <div id="div_id_form-1-image" class="mb-3"> <label for="id_form-1-image" class="form-label">


Image


</label> <div class=" mb-2"> <div> <input type="file" name="form-1-image" class="form-control" accept="image/*" id="id_form-1-image"> </div>





</div> </div> <div class="mb-3"> <div id="div_id_form-1-visible" class="mb-3"> <input type="checkbox" name="form-1-visible" class="checkboxinput form-check-input" id="id_form-1-visible"> <label for="id_form-1-visible" class="form-check-label">


Visible


</label> <small id="hint_id_form-1-visible" class="form-text text-muted">Select this field to activate this event on the home page</small> </div> </div> <div id="div_id_form-1-brief" class="mb-3"> <label for="id_form-1-brief" class="form-label">


Brief


</label> <input type="text" name="form-1-brief" maxlength="200" class="textinput textInput form-control" id="id_form-1-brief"> <small id="hint_id_form-1-brief" class="form-text text-muted">A brief description of the event</small> </div> <div id="div_id_form-1-details" class="mb-3"> <label for="id_form-1-details" class="form-label">


Details


</label> <textarea name="form-1-details" cols="40" rows="10" class="textarea form-control" id="id_form-1-details">


</textarea> <small id="hint_id_form-1-details" class="form-text text-muted">Separate each line with a fullstop and leave the last line empty</small> </div> <div id="div_id_form-1-venue" class="mb-3"> <label for="id_form-1-venue" class="form-label">


Venue


</label> <input type="text" name="form-1-venue" maxlength="200" class="textinput textInput form-control" id="id_form-1-venue"> </div> <div id="div_id_form-1-date" class="mb-3"> <label for="id_form-1-date" class="form-label requiredField">


Date<span class="asteriskField">*</span> </label> <input type="text" name="form-1-date" value="2023-01-22" class="dateinput form-control" id="id_form-1-date"><input type="hidden" name="initial-form-1-date" value="2023-01-22 19:26:45+00:00" id="initial-form-1-id_form-1-date"> </div> <div id="div_id_form-1-time" class="mb-3"> <label for="id_form-1-time" class="form-label">


Time


</label> <input type="text" name="form-1-time" maxlength="20" class="textinput textInput form-control" id="id_form-1-time"> </div> <div id="div_id_form-1-promoters" class="mb-3"> <label for="id_form-1-promoters" class="form-label">


Promoters


</label> <input type="text" name="form-1-promoters" maxlength="200" class="textinput textInput form-control" id="id_form-1-promoters"> </div> <div id="div_id_form-1-advance_ticket" class="mb-3"> <label for="id_form-1-advance_ticket" class="form-label requiredField">


Advance ticket<span class="asteriskField">*</span> </label> <input type="number" name="form-1-advance_ticket" value="0" min="0" class="numberinput form-control" id="id_form-1-advance_ticket"> </div> <div id="div_id_form-1-gate_ticket" class="mb-3"> <label for="id_form-1-gate_ticket" class="form-label requiredField">


Gate ticket<span class="asteriskField">*</span> </label> <input type="number" name="form-1-gate_ticket" value="0" min="0" class="numberinput form-control" id="id_form-1-gate_ticket"> </div> <div id="div_id_form-1-regular_ticket" class="mb-3"> <label for="id_form-1-regular_ticket" class="form-label requiredField">


Regular ticket<span class="asteriskField">*</span> </label> <input type="number" name="form-1-regular_ticket" value="0" min="0" class="numberinput form-control" id="id_form-1-regular_ticket"> </div> <div id="div_id_form-1-vip_ticket" class="mb-3"> <label for="id_form-1-vip_ticket" class="form-label requiredField">


Vip ticket<span class="asteriskField">*</span> </label> <input type="number" name="form-1-vip_ticket" value="0" min="0" class="numberinput form-control" id="id_form-1-vip_ticket"> </div> <div id="div_id_form-1-under18_ticket" class="mb-3"> <label for="id_form-1-under18_ticket" class="form-label requiredField">


Under18 ticket<span class="asteriskField">*</span> </label> <input type="number" name="form-1-under18_ticket" value="0" min="0" class="numberinput form-control" id="id_form-1-under18_ticket"> </div> <input type="hidden" name="form-1-id" id="id_form-1-id">





</div>







 

Regards,

Michael Maina

unread,
Jan 24, 2023, 4:16:52 AM1/24/23
to Django users
Resolved:

Using parameters  max_num=1, extra=0

Mea culpa
Reply all
Reply to author
Forward
0 new messages