views:

11

answers:

1

Hello- I'm new to Django and I'm creating an app to create and display employee data for my company. Currently the model, new employee form, employee table display, login/logout, all works. I am working on editing the current listings. I have hover on row links to pass the pk (employeeid) over the url and the form is populating correctly- except the manytomanyfields are not populating, and the pk is incrementing, resulting in a duplicate entry (other than any data changes made).

I will only put in sample of the code because the model/form has 35 total fields which makes for very long code the way i did the form fields manually (to achieve a prettier format).

#view.py  #SEE EDIT BELOW FOR CORRECT METHOD
@login_required
def employee_details(request, empid): #empid passed through URL/link
    obj_list = Employee.objects.all()
    e = Employee.objects.filter(pk=int(empid)).values()[0]
    form = EmployeeForm(e)
    context_instance=RequestContext(request) #I seem to always need this for {%extend "base.html" %} to work correctly
        return render_to_response('employee_create.html', locals(), context_instance,)

#URLconf 
    (r'^employee/(?P<empid>\d+)/$', employee_details),

# snippets of employee_create.html. The same template used for create and update/edit, may be a source of problems, they do have different views- just render to same template to stay DRY, but could add an additional layer of extend for differences needed between the new and edit requests EDIT: added a 3rd layer of templates to solve this "problem". not shown in code here- easy enough to add another child template
{% extends "base.html" %}
{% block title %}New Entry{% endblock %}
{% block content %}
<div id="employeeform">     
    {% if form.errors %}
        <p style="color: red;">
            Please correct the error{{ form.errors|pluralize }} below.
        </p>
    {% endif %}
    <form action="/newemp/" method="post" class="employeeform">{% csrf_token %} #SEE EDIT
        <div class="left_field">
            {{ form.employeeid.value }}

            {{ form.currentemployee.errors }}
            <label for="currentemployee" >Current Employee?</label>
            {{ form.currentemployee }}<br/><br/>

            {{ form.employer.errors }}
            <label for="employer" class="fixedwidth">Employer:</label>
            {{ form.employer }}<br/>

            {{ form.last_name.errors }}
            <label for="last_name" class="fixedwidth">Last Name:</label>
            {{ form.last_name }}<br/>

                    {{ form.facility.errors }} #ManyToMany 
            <label for="facility" class="fixedwidth">Facility:</label>
            {{ form.facility }}<br/><br/>
                </div>
        <div id="submit"><br/>
        <input type="submit" value="Submit">
        </div>
    </form> 



#models.py
class Employee(models.Model):
    employeeid = models.AutoField(primary_key=True, verbose_name='Employee ID #')
        currentemployee = models.BooleanField(null=False, blank=True, verbose_name='Current Employee?') 
        employer = models.CharField(max_length=30)
        last_name = models.CharField(max_length=30)
        facility = models.ForeignKey(Facility, null=True, blank=True)

base.html just has a header on top, a menu on the left and a big empty div where the forms, employee tables, etc all extend into.

screenshot2

So, how do I need to change my view and/or the in the template to update an entry, rather than creating a new one? ( And how do I populate the correct foriegnkeys? (the drop down boxes have the right options available, but the "-----" is selected even though the original database entry contains the right information.

Let me know if i need to include some more files/code I have more pics too but i cant link more or insert them as a new user :< I'll just have to contribute and help out other people! :D

EDIT: I've been working on this more and haven't gotten too far. I still can't get the drop-down fields to select the values saved in the database (SQLite3). But the main issue I'm trying to figure out is how to save as an update, rather than a new entry. save(force_update=True) is not working with the default ModelForm save parameters.

EDIT: ANSWER:

views.py
    def employee_details(request, empid):
        context_instance=RequestContext(request)
        obj_list = Employee.objects.all()

        if request.method == 'POST':
            e = Employee.objects.get(pk=int(empid))
            form = EmployeeForm(request.POST, instance=e)
            if form.is_valid():
                form.save() 
                return HttpResponseRedirect('/emp_submited/')
        else:
            e = Employee.objects.get(pk=int(empid))
            form = EmployeeForm(instance=e)
        return render_to_response('employee_details.html', {'form': form}, context_instance,)

also changed template form action to "" (from /newemp/ which was the correct location for my new employee tempalte, but not the update.

A: 

Answered in latest edit. Thanks to this similar question

j_syk