What I’m trying to do is Django boilerplate for functional views. Any help here is very much appreciated, as the docs show examples for the template view and list view, but I’ve found very little for the model-based generic views. Am I missing an example in the docs?
I have a model that represents an entry in a calendar. There’s a foreign key to another object (not a user) that owns the entry. What I want to do is simply to create the entry, ensuring that the entry’s foreign key is properly set and then return the user to the appropriate calendar page.
I don’t know, though, how class-based generic views receive their URL arguments and I’m not clear on how to set the success_url so that it reuses the id that was originally passed to the creation URL. Again, thank you in advance for your help.
What I’m asking, essentially, is, what is the class-based generic view equivalent of the following:
def create_course_entry(request, class_id):
'''Creates a general calendar entry.'''
if request.method == 'POST':
form = CourseEntryForm(request.POST)
if form.is_valid():
new_entry = form.save(commit=False)
new_entry.course = Class.objects.get(pk=class_id)
new_entry.full_clean()
new_entry.save()
return HttpResponseRedirect('/class/%s/calendar/' % class_id)
else:
form = CourseEntryForm()
return render_to_response('classes/course_entry_create.html',
{ 'class_id': class_id, 'form': form, },
context_instance=RequestContext(request))
You could subclass the
edit.CreateViewgeneric view, set the class/course in thedispatch()method, and save this by overriding theform_valid()method:If you’re not customising the
CourseEntryFormModelForm, then you can leave out theform_classproperty.Unfortunately, it is not possible to call
super()in theform_valid()method – due to the way it has been written would mean the object would be saved again.If you need the Class (course?) instance in the template context, then you can add this in the
get_context_data()method: