Django добавить объект с текущим пользователем
Я пытаюсь создать todoapp с google login для создания персонального todolist для каждого пользователя.
вот views.py
from django.contrib.auth.decorators import login_required
@login_required
def todoView(request):
all_todo_items = Todoitem.objects.filter(userid=request.user.id)
return render(request, 'todoapp/home.html', {'all_items': all_todo_items})
def addTodo(request):
add_new_item = Todoitem(content=request.POST['content'])
add_new_item.save()
return HttpResponseRedirect('/home/')
вот мой код без пользователей, но когда есть текущий пользователь, он выдает эту ошибку
null value in column "id" violates not-null constraint / DETAIL: Failing row contains (null, sampletodo,null). Я полагаю, что третий столбец, который является null, это userid, а первый столбец null это auto increment id, так как я установил его в id SERIAL первичный ключ в таблице todoitem
Я на 100% уверен, что мне нужно добавить что-то @addTodo views.py, я просто не знаю, как добавить todolist с текущим пользователем
EDIT вот мой models.py
class Todoitem(models.Model):
content = models.CharField(max_length=100)
userid = models.ForeignKey(AuthUser, models.DO_NOTHING,
db_column='userid')
class Meta:
managed = False
db_table = 'todoitem'
class AuthUser(models.Model):
password = models.CharField(max_length=128)
last_login = models.DateTimeField(blank=True, null=True)
is_superuser = models.BooleanField()
username = models.CharField(unique=True, max_length=150)
soon...
class Meta:
managed = False
db_table = 'auth_user'
Просто передайте текущего пользователя так же, как вы это сделали в todoView
. Объект request
имеет ссылку на текущего пользователя через request.user
. Но вам нужно указать объект user
, а не user.id
@login_required
def todoView(request):
all_todo_items = Todoitem.objects.filter(userid=request.user) # changed to request.user
return render(request, 'todoapp/home.html', {'all_items': all_todo_items})
def addTodo(request):
add_new_item = Todoitem(content=request.POST['content'], userid=request.user)
add_new_item.save()
return HttpResponseRedirect('/home/')
Вы должны использовать хорошую модель пользователя, чтобы иметь возможность использовать request.user
.
Попробуйте такую модель:
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
password = models.CharField(max_length=128)
last_login = models.DateTimeField(blank=True, null=True)
is_superuser = models.BooleanField()
username = models.CharField(unique=True, max_length=150)
тогда в ваших представлениях вы можете сделать следующее
def addTodo(request):
add_new_item = Todoitem(content=request.POST['content'], userid=request.user)
def todoView(request):
all_todo_items = Todoitem.objects.filter(userid=request.user) # changed to request.user
return render(request, 'todoapp/home.html', {'all_items': all_todo_items})