2014-12-26 12 views
5

Dopo tanto google non ho trovato alcuna soluzione pertinente per ottenere i dati dei modelli associati nelle viste.In Django 1.6.x come ottenere i dati dei modelli associati nelle viste?

Le cose sono che sto richiedendo al server tramite Ajax e voglio recuperare il nome del creatore di cartelle e cartelle (dal modello Utente). Ma non mi ha restituito il first_name del creatore. Ecco il codice

models.py

class UserFolder(models.Model): 
    creator = models.ForeignKey(User) 
    name = models.CharField(blank=False, max_length=150) 
    is_shared = models.BooleanField(default=False) 
    created_date = models.DateTimeField(auto_now_add=True) 
    modified_date = models.DateTimeField(auto_now=True) 

    def __str__(self): 
     return self.name 

views.py

def pagination(obj, request): 
    max = request.GET.get('max') if 'max' in request.GET else 1 
    paginator = Paginator(obj, max) # Show 25 contacts per page 
    page = request.GET.get('page') 
    try: 
     return paginator.page(page) 
    except PageNotAnInteger: 
     # If page is not an integer, deliver first page. 
     return paginator.page(1) 
    except EmptyPage: 
     return "" 

def folder_list(request): #called via ajax 
    folders = UserFolder.objects.filter(creator=request.user.id).order_by('-modified_date') 
    folders = pagination(folders, request) #for pagination 
    folders = json.dumps({}) if not folders else serializers.serialize("json", folders) 
    return HttpResponse(folders) 

Ho cercato .select_related ('creatore') troppo ma c'è bisogno d 'funzionare.

In js sto andare a prendere i dati in questo modo:

$.each(data, function(i, v) { 
         var t = fldrTpl, id = v.pk; 
         v = v.fields 
         t = t.replace(/\{(ID)\}/g, id); 
         t = t.replace(/\{(NAME)\}/g, v.name); 
         t = t.replace(/\{(C_SIZE)\}/g, (v.current_size == null?0:v.current_size)); 
         t = t.replace(/\{(C_ID)\}/g, v.creator.first_name); 
         t = t.replace(/\{(C_DATE)\}/g, v.created_date); 
         $(".my-folder-table").append(t); 
        }); 

v.creator.first_name tornare sempre indefinito.

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie

+0

non dovrebbe essere folders = UserFolder.objects.filter (creator = request.user) invece di request.user.id. request.user è un'istanza dell'utente mentre .id produce un numero intero. – user2707389

+0

Grazie per il tuo commento Ma ho provato anche questo e anche questo non ha funzionato. Restituisce solo i campi di UserFolders. –

+0

La voce first_name è stata testata sul modello User e ci fornisce anche i dettagli del modello dell'utente. –

risposta

1

È sempre possibile creare un dizionario dei dati che si desidera utilizzare sul vostro lato client:

def folder_list(request): #called via ajax 
    folders_obj = UserFolder.objects.filter(creator=request.user).select_related('creator').order_by('-modified_date').all() 
    folders_dict = [] 
    for folder in folders_obj: 
     d = {} 
     for k, v in folder.__dict__.items(): 
      d[k] = str(v) 
     d["creator__first_name"] = folder.creator.first_name 
     folders_dict.append(d) 
    folders = pagination(folders_dict, request) #for pagination 
    folders = json.dumps({}) if not folders else serializers.serialize("json", folders) 
    return HttpResponse(folders) 

e nel vostro JS:

t = t.replace(/\{(C_ID)\}/g, v.creator__first_name); 
+0

Grazie per la tua risposta, ma ho ancora un errore "aggiornamento previsto al massimo 1 argomenti, ottenuto 2" –

+0

Sì, ho risolto. – nima

+0

Grazie per la risposta rapida ma ancora non risolto "L'oggetto 'elenco' non ha attributo 'aggiungi'" –