2012-12-20 32 views
6

Mam modelu Django:Django zapisać modelu z anonimowym użytkownikiem

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

W moim views.py:

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

Chcę być w stanie zaoszczędzić użytkownikowi jako uwierzytelnionego użytkownika lub AnonymousUser (które mogę zaktualizować później). Jednakże, jeśli nie jestem zalogowany otrzymuję ten błąd:

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

Myślę, że Django nie uratuje AnonymousUser ponieważ nie jest użytkownikiem, jak określono w modelu User. Czy muszę dodać anonimowego użytkownika do modelu User, czy też czegoś brakuje?

Każda pomoc bardzo ceniona.

Odpowiedz

9

Pole user to ForeignKey. Oznacza to, że musi on odnosić się do użytkownika jakiegoś użytkownika.

Z definicji AnonymousUser jest żaden użytkownik: w Django, nie ma AnonymousUserA i AnonymousUserB. Wszystkie są takie same: AnonymousUser.

Wniosek: nie można umieścić AnonymousUser w UserForeignKey.


Rozwiązaniem problemu jest dość proste, ale: kiedy User jest anonimowe, po prostu zostawić to pole puste. Aby to zrobić, musisz na to zezwolić:

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

Ok, świetnie. Więc jeśli zrobię 'user = request.user' na' AnonymousUser', to pole będzie puste i nie zostanie zgłoszony żaden wyjątek? –

+0

Wyjątek zostanie zgłoszony, ponieważ dostarczyłeś niewłaściwe dane do pola. Po prostu wykonaj 'if request.user.is_authenticated(): project.user = request.user'pl –

+0

Czy muszę też dodać' null-True', ponieważ pole nie może mieć wartości 'null'? –

Powiązane problemy