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 %}