lundi 8 février 2016

ModelForm right approach for editing database record?

Can someone help me with fixing Django ModelForm?

This particular code can add new item to database as expected, but when I'm trying to edit db record - It just add new record, instead of updating old. I'm quite new in Django framework.

views.py:

def manage(request, item_id = None):
    t = get_object_or_404(Hardware, id=item_id) if item_id else None
    form = Manage(request.POST or None, instance=t)

if t:
    if form.is_valid():
        #form.save()
        hostname = form.cleaned_data['hostname']
        cpu = form.cleaned_data['cpu']
        os = form.cleaned_data['os']
        ram = form.cleaned_data['ram_total']
        storage = form.cleaned_data['storage']
        hostdata = Hardware(
        hostname=hostname,
        cpu=cpu,
        ram_total=ram,
        os=os,
        storage=storage,
        lock_state=t.lock_state, # because in edit operation we shouldn't change it.
        lock_date=t.lock_date, # because in edit operation we shouldn't change it.
        locked_by=t.locked_by) # because in edit operation we shouldn't change it.
        hostdata.save()
        return HttpResponseRedirect(reverse('main:index'))
elif not t:
    if form.is_valid():
        hostname = form.cleaned_data['hostname']
        cpu = form.cleaned_data['cpu']
        os = form.cleaned_data['os']
        ram = form.cleaned_data['ram_total']
        storage = form.cleaned_data['storage']
        current_user = request.user
        user = User.objects.get(id=current_user.id)
        hostdata = Hardware(
        hostname=hostname,
        cpu=cpu,
        ram_total=ram,
        os=os,
        storage=storage,
        lock_state=0,
        lock_date=datetime.datetime.now(),
        locked_by=user)
        hostdata.save()
        return HttpResponseRedirect(reverse('main:index'))

return render(request, 'hardware/edit.html', {'form': form})

models.py:

class Hardware(models.Model):
    hostname = models.CharField(max_length=255, default=None)
    os = models.CharField(max_length=255, default=None)
    cpu = models.CharField(max_length=255, default=None)
    ram_total = models.CharField(max_length=255, default=None)
    storage = models.CharField(max_length=255, default=None)
    lock_state = models.BooleanField(default=0)
    locked_by = models.ForeignKey(User)
    lock_date = models.DateTimeField(default=None)
    alive = models.BooleanField(default=0)

class Meta:
    db_table = "hardware"

def __str__(self):
    return self.hostname

forms.py:

class Manage(forms.ModelForm):
    class Meta:
        model = Hardware
        fields = ['hostname', 'os', 'cpu', 'ram_total', 'storage']

urls.py:

url(r'^manage/new/$', views.manage, name='add'),
url(r'^manage/edit/(?P<item_id>[0-9]+)/$', views.manage, name='edit')

template:

<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save!" />
</form>




Aucun commentaire:

Enregistrer un commentaire