шаблоны django: получить значение многие-ко-многим в formset - PullRequest
1 голос
/ 21 февраля 2012

Модель:

class Author(models.Model):
   ...
   first_name = models.CharField(max_length=30)
   ...

class Book(models.Model):
   title = models.CharField(max_length=100)
   authors = models.ManyToManyField(Author)
   ...

формы:

class BookForm(ModelForm):
    class Meta:
        model = Book

booklist.html:

<table>
{{ formset.management_form }}
{% for form in formset.forms %}
  <tr>
    <td> {{ form.title.value }} </td>
    <td> {{ form.authors }} </td>

  </tr>
{% endfor %}
</table>

Таким образом, выводится окно множественного выбора для авторов каждой книги. Как мне узнать имя автора в шаблоне?

Спасибо, Adi

редактировать: добавлено просмотров

вид:

def thebooks(request):
  BookFormSet = modelformset_factory(Book, form = BookForm)
  if request.method == 'POST':
    formset = BookFormSet(request.POST)
    if formset.is_valid():
      formset.save()
  else:
    formset = BookFormSet(queryset = Book.objects.all())
  return render_to_response('thebooks.html', {'formset': formset,}, context_instance=RequestContext(request) )

def booklist(request):
  BookFormSet = modelformset_factory(Book, form = BookForm)
  formset = BookFormSet(request.POST)
  return render_to_response('booklist.html', {'formset':formset,}, context_instance=RequestContext(request) )

js код для загрузки страницы списка книг на странице thebooks:

$(document).ready(function() {
      $("#form").submit(function() {
        $.post('/books/booklist/', $(this).serialize(),
          function(data) {
            if (data == "") { alert("No data returned!"); return; }
            // otherwise set the content div to the data we received
            $('#allElements').html(data);
          }
        );
        // disable normal submitting of the form since we use ajax now
        return false;
        });
    });

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Вы можете получить доступ к экземпляру модели в форме редактирования следующим образом:

<td>
    {% if form.instance.pk %}{# if this is the form of an existing book #}
        {% for author in form.instance.authors.all %}
            {# then you can iterate over the authors of the book #}
            {{ author.first_name }}
        {% endfor %}
    {% endif %}
</td>
0 голосов
/ 21 февраля 2012

Вы можете использовать метод unicode в классе модели для авторов:

class Author(models.Model):
   ...
   first_name = models.CharField(max_length=30)
   ...
   def __unicode__(self):
       return first_name

В раскрывающемся списке просто используйте {{form.authors}}.Вместо того чтобы сказать «Автор: объект модели» (или как там обычно говорят), теперь он скажет «Джон», если имя человека - Джон.

Преимущество здесь, конечно, в том, что у вас также есть прямой доступ кИдентификатор один раз выбран.

...