2015-10-23 5 views
5

Ho una tabelladjango: django-tables2 detailview CBV non visualizzerà solo oggetto

import django_tables2 as tables 
from .models import Account 
from django_tables2.utils import A # alias for Accessor 


class AccountTable(tables.Table): 
    nickname = tables.LinkColumn('accounts:detail', args=[A('pk')]) 

    class Meta: 
     model = Account 
     attrs = {'class': 'table table-striped table-hover'} 
     exclude = ("created", "modified", "destination") 

Una vista:

class DetailView(SingleTableMixin, generic.DetailView): 

    template_name = 'accounts/account_detail.html' 
    context_table_name = 'table' 
    model = Account 
    table_class = AccountTable 
    context_object_name = object 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(DetailView, self).dispatch(*args, **kwargs) 

    def get_context_data(self, **kwargs): 
     context = super(DetailView, self).get_context_data(object=self.object) 
     context['title'] = 'Account Detail' 
     context['pk'] = self.kwargs.get(self.pk_url_kwarg, None) 
     return context 

E un modello:

<!DOCTYPE html> 
{% extends "accounts/base.html" %} 
{% load django_tables2 %} 
{% load render_table from django_tables2 %} 
<title>Account Detail</title> 

{% block content %} 
<br> 
<br> 
<h1>{{ object.id }} : {{object.nickname}}</h1> 

<div> 
{% render_table table %}  
</div> 
{% endblock %} 

E correttamente ottiene l'oggetto pk e tutto, ma non invia solo il singolo oggetto per popolare la tabella. So che ottiene l'oggetto perché object.id e object.nickname vengono visualizzati correttamente. So che è possibile visualizzare solo un oggetto specifico perché ho un'altra app nello stesso progetto che visualizza un solo oggetto se fai clic sul link che ti porta a DetailView (il modello di cui ho preso in prestito per ricreare con i miei modelli di Account)). Ma mostrerà solo una tabella di TUTTI gli oggetti.

Posso inserire i dati di richiesta, se necessario. Posso prometterti che ho visto l'oggetto nel contesto del modello, e in effetti deve essere o object.id non funzionerebbe. Qual è il trucco per django-tables2? Apparentemente l'ho già fatto una volta!

risposta

3

È possibile ignorare il metodo get_table_data della vista e restituire un elenco di oggetti che si desidera visualizzare.

In questo caso, si desidera un elenco con un solo elemento, l'oggetto da DetailView.

def get_table_data(self): 
    return [self.object] 
+0

ottengo questo errore quando provo che senza la staffa: "dati devono essere QuerySet-simile (hanno contare e order_by) o lista di sostegno (dati) - Conto nessuno dei due ha." Poi ho visto che avevi una staffa e funzionava. Grazie! – mastachimp

+0

Le parentesi sono obbligatorie perché django-tables2 si aspetta 'get_table_data' per restituire un iterabile come un queryset o un elenco, non un singolo oggetto. – Alasdair