In my hackathon ticket here:  http://code.djangoproject.com/ticket/535,
I have been refactoring the admin hacks into the metasystem proper.

My latest patch ( django-admin-refactor-4.patch ) enables easy inline
editing outside the admin with no messing about in view functions.

Here is an example, which works well with the above patch.
:

Subset of my model:

class Workout(meta.Model):
        user = meta.ForeignKey(auth.User)
        start_time = meta.DateTimeField()
        length = meta.IntegerField()
        class META:
                admin = meta.Admin()
                ordering = ('-user', 'start_time')


class Set(meta.Model):
        workout = meta.ForeignKey(Workout, edit_inline=meta.TABULAR)
        exercise = meta.ForeignKey(Exercise, core=True)
        spotter = meta.ForeignKey(auth.User, null=True, blank=True)
        load = meta.FloatField(max_digits=4,decimal_places=1)
        reps = meta.PositiveIntegerField(core=True)
        sequence = meta.IntegerField(null=True, blank=True)

        class META:
                ordering=('sequence',)


View function:

def workout_edit_inline(request, object_id):
    try:
        workout = workouts.get_object(id__exact=object_id)
    except workouts.WorkoutDoesNotExist:
        raise Http404

    manipulator = workouts.ChangeManipulator(workout.id)

    if request.POST:
        new_data = request.POST.copy()
        errors = manipulator.get_validation_errors(new_data)
        if not errors:
            manipulator.do_html2python(new_data)
            manipulator.save(new_data)
            return HttpResponseRedirect("/workouts/%s/edit_inline/" %
                                         object_id)
    else:
        errors = {}
        # ********** Heres the new bit *********************
        new_data = manipulator.flatten_data()

    form = formfields.FormWrapper(manipulator, new_data, errors,
                                  edit_inline=True) # <----- extra arg
    t = template_loader.get_template('tracker/workout_edit_inline')
    c = Context(request, {
        'form' : form,
        'workout': workout
    })
    return HttpResponse(t.render(c))


Template with error handling removed for clarity:
{% extends "base" %}


{% block title %}
  {{ workout }}
{% endblock %}


{% block content %}


   <div class="workout" id="workout-{{object.id}}">

    <form method="post" action="">
    <p><label>User: {{ form.user }} </label> </p>
    <p>Start:
       <p><label>Date: {{ form.start_time_date }} </label> <p>
       <p><label>Time: {{ form.start_time_time }} </label> </p>
    </p>
   <p><label>Length: {{ form.length }} minutes </label> </p>
    {% for set in form.sets %}
        <hr />
        <div>
            <h3> Set #{{ forloop.counter}} </h3>
            {{set.id }}
            <p> <label> Exercise: {{ set.exercise }} </label></p>
            <p> <label> Spotter: {{ set.spotter}}</label> </p>
            <p> <label> Load: {{ set.load}} </label>  </p>
            <p> <label> Reps: {{ set.reps }} </label>  </p>
            <p> <label> Sequence: {{ set.sequence }} </label> </p>
        </div>
    {% endfor %}

    <input type="submit">
    </form>


   </div>
{% endblock %}


Reply via email to