#python #django
Вопрос:
Я работаю над простым проектом в Django, который является приложением для выполнения. Недавно я добавил в этот проект форму входа/регистрации, но, несмотря на то, что у каждого пользователя есть своя учетная запись со своими учетными данными, они получают доступ к одним и тем же данным. Я пытался использовать 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)
Не знаю, как это решить, и было бы здорово, если бы вы могли показать мне способ, как это решить. Спасибо!
Ответ №1:
Изменить
todo.objects.filter(content__user=user)
Для
todo.objects.filter(user=user)
Комментарии:
1. Спасибо, приятель, теперь это работает, но, наверное, я забыл упомянуть об этом. Чтобы получить весь контент, который я использовал
all_items = todo.objects.all().order_by("created")
. И теперь, когда я используюfilter()
вместо этого, он не показывает данные. Может ли это быть правильным способом фильтрации в другой переменной??