2012-02-21 3 views
1

modèles:modèles django: obtenir many-to-many valeur Formset

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) 
    ... 

formes:

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> 

Ainsi, cette commande affiche un multiple sélectionnez la case pour les auteurs de chaque livre. Comment puis-je obtenir le prénom des auteurs dans le modèle?

Merci, Adi

modifier: vues ajouté

vues:

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)) 

code js pour charger la page booklist dans la page 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; 
     }); 
    }); 

Répondre

1

Vous pouvez accéder à l'instance de modèle dans un formulaire d'édition en tant que tel:

<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

merci pour votre réponse, mais ça ne marche pas ... aucune erreur ... rien ... n'affiche tout simplement pas le nom – adi

+0

Intéressant, affichez la vue et formez le code python pour pouvoir le donner un essai. – jpic

+0

J'ai ajouté le code de vues. En fait, "booklist" est affiché dans un div à l'intérieur de la page "thebooks". en utilisant le code js. Donc, la chose nom de l'auteur (le code du modèle) est dans la vue de la liste de livres – adi

0

Vous pouvez utiliser la méthode unicode sur la classe modèle pour les auteurs:

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

Dans le menu déroulant {{il suffit d'utiliser form.authors}}. Au lieu de dire Auteur: Modèle objet (ou tout ce qu'il dit normalement), il va maintenant dire "John" si le prénom de la personne est John. L'avantage est évidemment que vous avez également un accès direct à l'identifiant une fois sélectionné.

+0

J'ai la fonction unicode déjà définie ... elle ne formate que la façon dont les auteurs sont affichés dans la boîte de sélection multiple générée par le formset. ma question était de savoir comment puis-je accéder à des valeurs réelles fieldtomany du modèle. – adi

Questions connexes