2012-01-07 12 views
5

Sto utilizzando modelform per ottenere la playlist e i relativi elementi. Contiene anche script di accesso. Sto cercando di impostare l'utente attualmente connesso al modello utente. Si può vedere questa cosa che ho postato prima How to avoid this dropdown combo box?valueError in modelforms

class playlistmodel(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=200) 

    def __unicode__(self): 
     return self.title 

class itemsmodel(models.Model): 
    playlist = models.ForeignKey(playlistmodel) 
    item = models.TextField() 

    def __unicode(self): 
     return self.item 

class playlistform(ModelForm): 
    class Meta: 
     model = playlistmodel 
     exclude = {'user'} 

class itemsform(ModelForm): 
    class Meta: 
     model = itemsmodel 
     exclude = {'playlist'} 

Ecco la vista playlist:

def playlistview(request): 
    if request.method == 'POST': 
     form = playlistform(request.POST) 
     if form.is_valid(): 
       data = form.save(commit=False) 
       data.user = request.user 
       data.save() 
       return render_to_response('playlist.html', {'data': data}) 
    else: 
     form = playlistform() 
     return render_to_response('playlist.html', {'form': form, 'user': request.user}, context_instance=RequestContext(request)) 

Playlist.html di file:

https://gist.github.com/1576136

pagina di errore:

https://gist.github.com/1576186

Ma sto ValueError:

Exception Type: ValueError Exception Value: Cannot assign "<django.utils.functional.SimpleLazyObject object at 0x7f0234028f50>": "playlistmodel.user" must be a "User" instance 

Traceback: Local vars --- data.user = request.user 

Ecco il mio settings.py https://gist.github.com/1575856

Grazie.

+1

Nel caso, verificare di avere il [TEMPLATE_CONTEXT_PROCESSORS] predefinito (https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors) in 'settings.py' –

+0

Quale versione di Django stai usando? Prova 'dati.user_id = request.user.id' invece. – Alasdair

+0

@ César Ho postato il link per settings.py nella mia sezione domande. – rnk

risposta

0

difficile da dire, ma vorrei provare questo nel vostro playlistview:

form = playlistform(request, request.POST, instance=playlistmodel) 

forse si può ommit l'ultimo parametro (istanza = playlistmodel), perché questo sarebbe solo bisogno se si modifica un oggetto esistente

Spero che questo aiuti ...

+0

Sembra che la sintassi precedente non funzioni. Sta mostrando errore di attributo. Grazie. – rnk

+0

Triste :(, tutto quello che posso dire è che questa sintassi funziona per me in una situazione simile. – Jingo

0

ho lo stesso problema, ma sorge solo quando nessun utente è connesso a (in attesa di un'istanza AnonymousUser). Almeno quando il mio superutente ha effettuato l'accesso, non ho riscontrato alcun problema.

Nonostante non ho trovato una soluzione ancora, forse troverete un indizio in questo answer

Bene, ora mi sono reso conto che nel mio caso AnonymousUser devono essere conservati come nulla nel db, ma lasciare questa risposta per pubblicare il link di indizio (non hai ancora il permesso di lasciare commenti).

Spero che aiuti!

5

So che questo post è vecchio, ma se qualcuno arriva qui con lo stesso problema, la risposta è che request.user è in realtà un wrapper per django auth.user. Quindi request.user è uno SimpleLazyObject ed è lo scopo è evitare l'istanziazione non necessaria e anche l'implementazione di un meccanismo di caching utente semplice. Per accedere l'utente reale (e un'istanza, quando si accede per la prima volta), è necessario fare:

auth.get_user(request)

questo vi darà un esempio di auth.user. Se hai bisogno di maggiori dettagli su cosa sta succedendo all'interno, vedi this post.

Problemi correlati