tl:dr -- How do I explicitly render the fields in a form that's passed to 
the context dictionary within an object?

I'm building a page right now that shows a list of documents to the user. 
 Each document has a type, a status, a list of images associated with it, 
and finally a document update form with a few fields in it.  Because all of 
these pieces of data belong together, I created a class to group them for 
display (this is a simplified version for example only):

class Document:
    def __init__(self, doc_type, doc_status):
        self.doc_type = doc_type
        self.doc_status = doc_status
        self.update_form = DocUpdateForm()

def doc_view(request):
    # ... some other stuff to get the raw data ...

    documents = []

    for raw_doc in raw_document_data:
        documents.append(Document(raw_doc.doc_type, raw_doc.doc_status))

    context['documents'] = documents

    return render_to_response('doc_list.html', context)

This all worked fine, because then in my template I was able to do 
something nice and simple like this:

...
<h2>Documents</h2>
<table>
  <tr><th>Document Type</th><th>Document Status</th><th>Update</th></tr>
  {% for doc in documents %}
    <tr>
      <td>{{ doc.doc_type }}</td>
      <td>{{ doc.doc_status }}</td>
      <td><form>{{ doc.update_form }}<input type='submit'/></form></td>
    </tr>
  {% endfor %}
</table>

Piece of cake, right?

Well, now we want to change the page so that some of the form fields are 
inside of one div, and some inside of another one so that they can be next 
to one another instead of oriented vertically.  I consulted the Django 
documentation here: 
https://docs.djangoproject.com/en/1.9/topics/forms/#rendering-fields-manually 
and 
decided to render each of the fields myself.  This resulted in something 
like:

...
<h2>Documents</h2>
<table>
  <tr><th>Document Type</th><th>Document Status</th><th>Update</th></tr>
  {% for doc in documents %}
    <tr>
      <td>{{ doc.doc_type }}</td>
      <td>{{ doc.doc_status }}</td>
      <td><form><div>{{ doc.update_form.field_1 }}</div>
                <div>{{ doc.update_form.field_2 }}</div>
                <input type='submit'/></form></td>
    </tr>
  {% endfor %}
</table>


Unfortunately, all this does is render the text "doc.update_form.field_1" 
instead of the form field.  It's the same behavior that I see when I 
accidentally try to reference a key that doesn't exist in the context 
dictionary.

I can, of course, just write the form fields HTML by hand . . . but 
goshdarnit, I'm a developer, and I want to know why the lazy way isn't 
working.  Do I need to reference the form fields differently than the 
documentation suggests?  Is it because I'm passing the forms to the context 
inside of another object?  Should I be learning how to use formsets and/or 
fieldsets?

This app uses Django 1.8, in case that's important.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/b083c21e-4cf6-442b-a246-4443601d6f2b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to