I was impressed with how quickly a functional website can fit in with the general views in textbooks. In addition, the workflow for processing forms is good. I used the ModelForm helper class to create a form from a model I made, and was glad to see so many functions coming together. When I used the general list_detail.object_detail list, I was disappointed that all I could display were fields individually. I knew that the ModelForm class contains information for rendering, so I wanted to use ModelForm with a general view.
I asked about stackoverflow to get some direction, and appreciate the answers and comments of several posters. I figured out how to make this work, but there is an error in DetailView. The solution includes a workaround.
To use the ModelView with a general view and automatically display all fields, follow these steps:
Create a project and create a stationary application in it.
If you
# inpatients/models.py class Inpatient(models.Model): last_name = models.CharField(max_length=30) first_name = models.CharField(max_length=30,blank=True) address = models.CharField(max_length=50,blank=True) city = models.CharField(max_length=60,blank=True) state = models.CharField(max_length=30,blank=True) DOB = models.DateField(blank=True,null=True) notes = models.TextField(blank=True) def __unicode__(self): return u'%s, %s %s' % (self.last_name, self.first_name, self.DOB) class InpatientForm(ModelForm): class Meta: model = Inpatient
and
# inpatients/views.py from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render_to_response from django.views.generic import DetailView from portal.inpatients.models import * def formtest(request): if request.method == 'POST': form = InpatientForm(request.POST) if form.is_valid(): form.save() return HttpResponseRedirect('/inpatients') else: form = InpatientForm() return render_to_response("formtest.html", {'form': form}) class FormDetailView(DetailView): model=Inpatient context_object_name='inpatient'
and
#urls.py from django.conf.urls.defaults import patterns, include, url from django.views.generic import ListView from portal.inpatients.models import Inpatient, InpatientForm from portal.inpatients.views import FormDetailView urlpatterns = patterns('', (r'^formtest/$','portal.inpatients.views.formtest'), (r'^inpatients/$', ListView.as_view( model=Inpatient, template_name='inpatient_list_page.html')), (r'^inpatient-detail/(?P<pk>\d+)/$', FormDetailView.as_view()), )
it works. Instructions for using general class representations are based on https://docs.djangoproject.com/en/1.3/topics/class-based-views/ The instructions there are pretty clear. The key to working on this is to override get_object. In the documentation in the βDoing More Workβ section, she describes how to do this, the steps involved in invoking the original version of get_object, and then the additional work. I realized that the returned object could be a ModelForm object. The object that get_object returns gets directly into the template in rendering. By accepting the received stationary object and launching it through InpatientForm, it can be passed to the view as a form, which then displays itself.
As for the error: the error in DetailView is that the get_template_names function is trying to create a template name from a structure that does not exist. At https://code.djangoproject.com/browser/django/trunk/django/views/generic/detail.py in lines 127 to 140 we have inside SingleObjectTemplateResponseMixin.get_template_names:
127
The error is that the code on line 131 executes and dies with an error message. The 'ModelFormOptions' object does not have the 'app_label'> attribute. I conclude that the _meta object is defined. I believe the problem is that the Meta class is defined in ModelForm. Meta probably has no fields defined. The workaround is to simply rewrite get_template_names and return the correct template.
I am new to Django and Python. I appreciate the answers and comments of the participants in the following previous questions that I asked. ( Entering links in list_detail.object_list in list_detail.object_detail , Using the form in object_detail , Moving your own shared views in Django )
What should I do to report an error?