Ye Wai Yan Oo
Ye Wai Yan Oo

Reputation: 11

Why my edit form not updating data, but able to create new instance. I try every thing on google but still not working

I have a form for creating the object, and it works fine. When I use that form for editing the object, it doesn't work. I did debugging the post method,and it also works fine, the form is valid, the redirect work, the success message appear, but not update the object. The form instance is also work correctly. It just don't update

# models.py 
class Item(models.Model):

    status_choices = (
            ('rent','Rent'),
            ('give', 'Give'),
            ('share','Share'),
        )
    item_types = (
            ('book','Book'),
            ('movie','Movie',),
            ('data','Data'),
            ('other','Other'),
        )
    title = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, blank=True,unique=True)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL)
    cover = models.ImageField(upload_to='items/%Y/%m/%d',blank=True)
    link  = models.URLField(blank=True)
    description = models.TextField(max_length=500, blank=True)
    status = models.CharField(max_length=10,choices=status_choices,default='Share')
    item = models.CharField(max_length=10, choices=item_types,default='Data', verbose_name='Item Type')
    publish = models.DateTimeField(auto_now=True,null=True)

    class Meta:
        ordering = ('-publish',)
        index_together = (('id', 'slug'),)

    def __str__(self):
        return '{} : <{}> for {}'.format(self.title,self.item,self.status)

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
            super(Item, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('item_edit', kwargs={'slug':self.slug})    

 #forms.py
 class ItemShareForm(forms.ModelForm):

     class Meta:
         model = Item 
         fields = ('title', 'cover', 'link', 'description', 'status', 'item')

         widgets = {
             'description' : forms.Textarea(),
         }    

 #views.py
 @login_required
 def item_edit(request,slug):
    instance = get_object_or_404(Item,slug=slug)
    if request.method == 'POST': #check the request method
        edit_form = ItemShareForm(request.POST ,instance=instance)
        if edit_form.is_valid(): # check the form validation
            update_item = edit_form.save(commit=False)
            update_item.owner = request.user #assign the owner
            update_item.save() # update the instance
            messages.success(request,'Your item has been updated successfully') # writing the message to user
            return redirect('/')
        else:
            messages.error(request,'Error updating your item...')
    else:
        edit_form = ItemShareForm(instance=instance)
    return render(request, 'account/share.html',{'itemform':edit_form})*

Upvotes: 1

Views: 60

Answers (1)

solarissmoke
solarissmoke

Reputation: 31434

You have overridden you model save method like so:

def save(self, *args, **kwargs):
    if not self.slug:
        self.slug = slugify(self.title)
        super(Item, self).save(*args, **kwargs)

This means that the object will only ever get saved if the slug is empty - i.e., it will only ever get saved once. Any future calls to save will not execute that if block, and nothing will happen.

You probably mean to do this instead - note indentation of the last line:

def save(self, *args, **kwargs):
    if not self.slug:
        self.slug = slugify(self.title)

    super(Item, self).save(*args, **kwargs)

Upvotes: 2

Related Questions