2012-12-20 10 views
6

Ho un modello di Django:Django risparmiare modello con utente anonimo

class Project(models.Model): 
    user = models.ForeignKey(User) 
    zipcode = models.CharField(max_length=5) 
    module = models.ForeignKey(Module) 

Nel mio views.py:

def my_view(request): 
    ... 
    project = Project.objects.create(
        user=request.user, 
        product=product_instance, 
        ... 
      ) 
    project.save() 

voglio essere in grado di salvare utente come un utente autenticato o un AnonymousUser (che posso aggiornare in seguito). Tuttavia, se non sono collegato ottengo questo errore:

ValueError: Cannot assign "<django.utils.functional.SimpleLazyObject object at 0x1b498d0>": "Project.user" must be a "User" instance. 

Immagino che Django non salverà la AnonymousUser perché non è un utente come definito nel modello User. Devo aggiungere l'utente anonimo al modello User o mi manca qualcosa?

Qualsiasi assistenza molto apprezzata.

risposta

9

Il campo user è un ForeignKey. Ciò significa che deve fare riferimento a un utente.

Per definizione, il AnonymousUser è nessun utente: in Django, non v'è alcuna AnonymousUserA e AnonymousUserB. Sono tutti uguali: AnonymousUser.

Conclusione: non è possibile inserire un AnonymousUser in un UserForeignKey.


La soluzione al tuo problema è abbastanza semplice però: quando il User è anonimo, basta lasciare vuoto il campo. Per fare ciò, devi permetterlo:

user = models.ForeignKey(User, blank = True, null = True) 
+0

Ok, fantastico. Quindi, se eseguo 'user = request.user' su' AnonymousUser', il campo sarà vuoto e non verrà sollevata alcuna eccezione? –

+0

Viene sollevata un'eccezione perché hai fornito dati inappropriati al campo. Esegui 'if request.user.is_authenticated(): project.user = request.user' –

+0

Devo anche aggiungere' null-True', in quanto il campo non può essere 'null'? –

Problemi correlati