lukik
lukik

Reputation: 4060

Edit data in a form

I've been able to use a django form and template to insert data to the database. I can also display the data in a very basic HTML page. However, am completely unable to figure out how I go about editing the data. Am assuming that I can at least reuse the django template I used to create a new database entry to also edit the entries thus eliminating the need to create an "edit" template.

Mind you I can edit the entry in console but in the browser I just can't seem to get my head around to how to load the data, which variables carry my primary key when I click on a link of a displayed vehicle and how to pass the fetched data from the database to the form to allow for editing etc. I've checked the admin site for guidance on how it does it on that end but still.... no luck.

Here is my insert code: How do I modify this to allow me to edit the data displayed by the vehicle.html further below?

views.py

vehicle_add - inserts to database

def vehicle_add(request):
if request.method == 'POST':
    form = VehicleForm(request.POST)
    if form.is_valid():
        newvehicle = Vehicle()
        vdetails = form.cleaned_data
        newvehicle.reg_number= vdetails['regnumber']
        newvehicle.model= vdetails['model']
        newvehicle.manufacturer= vdetails['manufacturer']
        newvehicle.year= vdetails['year']
        newvehicle.chassis_number= vdetails['chasisnumber']
        Vehicle.save(newvehicle)
        return HttpResponseRedirect('/vehicle')
else:
    form = VehicleForm()
return render_to_response('vehicle_add.html', {'form': form}, context_instance=RequestContext(request))

The vehicle.html loads the data in a simple HTML format as below:

{% for v in obj %}
            <tr><td><a href="/vehicle/{{v.id}}/">{{ v }}</a></td></tr>
{% endfor %}    

The link is displayed like this: http://localhost:8000/vehicle_add/2/

More Info: vehicle_add.html

{% extends "base.html" %}
{% block title %}Add Vehicle{% endblock %}
{% block page %}Add Vehicle{% endblock %}
{% block content %}
<html>
<head>
<style type="text/css">
    ul.errorlist {
    margin: 0;
    padding: 0;}
    .errorlist li {
    background-color: red;
    color: white;
    display: block;
    font-size: 10px;
    margin: 0 0 3px;
    padding: 4px 5px;}
</style>
</head>
<body>
<section id = "mainform">
{% if form.errors %}
    <p style="color: red;">
        Please correct the error{{ form.errors|pluralize }} below.
    </p>
{% endif %}
<form action="" method="post">{% csrf_token %}
    <div class="field">
        {{ form.regnumber.errors }}
        <label for="id_regnumber">Reg #:</label>
        {{ form.regnumber }}</div>
    <div class="field">
        {{ form.model.errors }}
        <label for="id_model">Model:</label>
        {{ form.model }}</div>
    <div class="field">
        {{ form.manufacturer.errors }}
        <label for="id_manufacturer">Manufacturer:</label>
        {{ form.manufacturer }}</div>
    <div class="field">
        {{ form.year.errors }}
        <label for="id_year">Year:</label>
        {{ form.year }}</div>
    <div class="field">
        {{ form.chasisnumber.errors }}
        <label for="id_chasisnumber">Chasis #:</label>
        {{ form.chasisnumber }}</div>
    <div class="field">
        <input type="submit" value="Submit">
        <input type="submit" value="Clear">
    </div></form></section>
</body>
</html>
{% endblock %}

Trial and Error:

This is what I've tried to do with my view but with no luck:

def vehicle_add(request):
if request.method == 'POST':
    form = VehicleForm(request.POST)
    if form.is_valid():
        newvehicle = Vehicle()
        vdetails = form.cleaned_data
        newvehicle.reg_number= vdetails['regnumber']
        newvehicle.model= vdetails['model']
        newvehicle.manufacturer= vdetails['manufacturer']
        newvehicle.year= vdetails['year']
        newvehicle.chassis_number= vdetails['chasisnumber']
        Vehicle.save(newvehicle)
        return HttpResponseRedirect('/vehicle')
else:
    #WORKING ON THIS
        form = VehicleForm
        newvehicle = Vehicle.objects.get(pk=9)
        form = VehicleForm(newvehicle)
return render_to_response('vehicle_add.html', {'form': form}, context_instance=RequestContext(request))

But on doing so I get different type of errors. Am not even sure if that is how to do it. Can somebody point me in the right direction?

EDIT

Here is the current error:

Caught AttributeError while rendering: 'Vehicle' object has no attribute 'get'

In template d:\dev\workspace\vehicle_request\vehicle_request\mvmanager\templates\vehicle_add.html, error at line 31

It then highligths this part of the template: {{ form.regnumber }}

forms.py

class VehicleForm(forms.Form):
regnumber = forms.CharField(
                            max_length=7,
                            label='Reg #:',
                            widget = forms.TextInput(attrs={'size':7})    )
model = forms.CharField(
                        label='Model',
                        widget = forms.TextInput(attrs={'size':25})    )
manufacturer = forms.CharField(
                               max_length=25,
                               label='Manufacturer',
                               widget = forms.TextInput(attrs={'size':25})    )
year = forms.IntegerField(
                          label='Year',
                          widget = forms.TextInput(attrs={'size':4})    )
chasisnumber = forms.CharField(
                               required=False, label='Chasis #',
                               widget = forms.TextInput(attrs={'size':25})    )

Upvotes: 0

Views: 846

Answers (2)

Vadim Ya
Vadim Ya

Reputation: 43

Modify url conf line to use parameters in url,

e.g.:

(r'^vehicle_add/(\d+)/$','app.views.vehicle_add')

In vehicle_add first parameter (second after self parameter) will be vehicle_id taken from url.

You can name it as you wish, e.g. vehicle_id.

Use it :

newvehicle= Vehicle.objects.get(pk=vehicle_id)

Upvotes: 1

Jeffrey Bauer
Jeffrey Bauer

Reputation: 14080

Pass the form a dict:

#WORKING ON THIS
    # form = VehicleForm  <<< THIS LINE IS UNNECESSARY
    newvehicle = Vehicle.objects.get(pk=9)
    form = VehicleForm(newvehicle.__dict__)

Upvotes: 0

Related Questions