Search code examples
djangosavemodelsx-editable

django x-editable /post URL issue & django model save


I would like to click on the object and change its attribute value and save it by updating object with new attribute value.

I try to achieve it with x-editable however it gives me an issue as per the picture below. I believe it is sth to do with my url defined in main.js script.

Any ideas how can I solve it ? I would like to use django model save function because I use it for other further reasons.

This is when I click on substage value and x-editable jquery works: enter image description here

but it does not SAVE new value: enter image description here

Terminal returns:

[08/May/2016 17:06:03]"POST /post HTTP/1.1" 404 2027

Below is part of my templates code:

{% for substage in trsubstage.substages_related %}
    {% for zone in zones %}
        {% if zone == substage.stage.zone %}
            <td style="width:40px" align="center">
                <div id="substage">
                    <a href="#" data-pk="{{ substage.id }}" data-type="text" >
                        {{ substage.substage_value }}</a>
                </div>
            </td>
        {% endif %}
    {% endfor %}
{% endfor %}

here is my main.js code:

$(document).ready(function() {
    //toggle `popup` / `inline` mode
    $.fn.editable.defaults.mode = 'popup';

$('#substage a').editable({
    type: 'text',
    name: 'username',
    url: '/post',
    title: 'Enter username'
    });
});

here are my urls:

urlpatterns = [
    url(r'^$', views.MainStatusView.as_view(), name='mainstatus'),
    ]

and here is my model Substage:

class SubStage(models.Model):
    tablerow_substage = models.ForeignKey(TRSubStage)
    stage = models.ForeignKey(Stage)
    substage_value = models.PositiveSmallIntegerField(default=0)
    created_date = models.DateField(auto_now_add= True)
    created_time = models.TimeField(auto_now_add= True)

    def __str__(self):
        return '%s.%s.%s' % (self.stage.zone,
                             self.stage.tablerow_stage.stage_name,
                             self.tablerow_substage.substage_num)

    def __init__(self, *args, **kwargs):
        super(SubStage, self).__init__(*args, **kwargs)
        self.value_original = self.substage_value

    def save(self, **kwargs):
        with transaction.atomic():
            response = super(SubStage, self).save(**kwargs)
            if self.value_original != self.substage_value:
                substage_log = SubStageLog()
                substage_log.substage = self
                substage_log.substage_value = self.value_original
                substage_log.save()

            return response


class SubStageLog(models.Model):
    substage = models.ForeignKey(SubStage)
    substage_value = models.PositiveSmallIntegerField(default=0)
    update_date = models.DateField(auto_now_add= True)
    update_time = models.TimeField(auto_now_add= True)


    def __str__(self):
        return '%s | %s | %s' % (self.substage, self.update_date, self.update_time)

# to change str(self.id) to self.slug (but I need to add slug attribute to RoomLog)
    def get_absolute_url(self):
        return '/mods/' + str(self.id) + '/'

Solution

  • You do not have a url called "post" in your urls.py so your js functions but the request has no idea where to send your data.