Как сделать ссылки из многих полей на одно в Django 3.2?
Я работаю над простым проектом на Django, который представляет собой приложение To Do. Недавно я добавил в этот проект форму входа/регистрации, но несмотря на то, что у каждого пользователя есть своя учетная запись со своими учетными данными, они имеют доступ к одним и тем же данным. Я пытался использовать models.ForeignKey(User, on_delete=models.CASACADE)
, но он показывает мне эту ошибку: django.core.exceptions.FieldError: Unsupported lookup 'user' for CharField or join on the field not permitted.
Чтобы лучше понять это, покажу полный код:
models.py
from django.db import models
from django.contrib.auth.models import User
from django.db.models.deletion import CASCADE
# Create your models here.
class todo(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.CharField(max_length=200)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.content
class User(models.Model):
name = models.CharField(max_length=200, null=True)
email = models.CharField(max_length=200, null=True)
def __str__(self):
return self.name
views.py
from django.http.response import HttpResponse
from django.shortcuts import render, redirect
from django.utils import timezone
from django.db.models import Count
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.contrib import messages
from .models import *
from .models import __str__
from .forms import CreateUserForm
# Create your views here.
@login_required(login_url='login/')
def home(request):
user = request.user
count_item = todo.objects.count()
all_items = todo.objects.filter(content__user=user).order_by("created")
context = {'all_items': all_items, 'count_item':count_item}
return render(request, 'html/home.html', context)
@login_required(login_url='login/')
def add_todo(request):
current_date = timezone.now()
new_item= todo(content = request.POST["content"])
new_item.save()
return redirect('/')
@login_required(login_url='login/')
def delete_todo(request, todo_id):
item_to_delete = todo.objects.get(id=todo_id)
item_to_delete.delete()
return redirect('/')
def login_user(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(request, username=username, password=password)
# print('USER:', user)
if user is not None:
login(request, user)
return redirect('/')
return render(request, 'html/login.html')
def logoutUser(request):
logout(request)
return redirect('login/')
def register_user(request):
form = CreateUserForm()
if request.method == 'POST':
form = CreateUserForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.save()
user = authenticate(request, username=user.username, password=request.POST.get('password1'))
print("USER:",user)
if user is not None:
login(request, user)
return redirect('/')
context = {'form':form}
return render(request, 'html/register.html', context)
Не знаю, как это решить, и было бы здорово, если бы вы могли показать мне способ, как это решить. Спасибо!
Change
todo.objects.filter(content__user=user)
to
todo.objects.filter(user=user)