#python #django #django-models #foreign-keys #django-database
#python #django #django-модели #внешние ключи #django-база данных
Вопрос:
Я изучаю Django (очевидно), и одна вещь, которую я только что заметил в проекте, который я создаю, заключается в том, что изначально каждый пользователь мог видеть объекты / контент, созданные любым другим пользователем. Например, мой проект — это очень простое приложение для фэнтези-футбола, я настроил его так, чтобы пользователь мог создать команду, добавив перечисленных игроков в мою модель команды под названием «MyTeam», как показано здесь .
class Myteam(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
QB = models.CharField(max_length=80, null=True)
QBscore = models.IntegerField(null=True)
RB1 = models.CharField(max_length=80, null=True)
RB1score = models.IntegerField(null=True)
RB2 = models.CharField(max_length=80, null=True)
RB2score = models.IntegerField(null=True)
WR = models.CharField(max_length=80, null=True)
WR1score = models.IntegerField(null=True)
WR2 = models.CharField(max_length=80, null=True)
WR2score = models.IntegerField(null=True)
TE = models.CharField(max_length=80, null=True)
TEscore = models.IntegerField(null=True)
D = models.CharField(max_length=80, null=True)
Dscore = models.IntegerField(null=True)
K = models.CharField(max_length=80, null=True)
Kscore = models.IntegerField(null=True)
Я узнал о ForeignKeys для привязки определенного контента к конкретному пользователю, и следующий шаг, который я пытаюсь выяснить, — это как сделать так, чтобы вошедший в систему пользователь мог видеть только свою команду и никого другого. Я искал здесь и в других местах через Google, но, как новичок в Django, трудно даже сформулировать правильный вопрос для поиска в первую очередь.
Я думал, что я на правильном пути, когда где-то увидел, что мне может понадобиться отфильтровать содержимое, возвращаемое в моем views.py . Вот что я пробовал ранее, но это не сработало.
def index(request):
team = Myteam.objects.filter(user=request.user.username)
Это всегда возвращает ошибку…
Не удается разрешить ключевое слово «user» в поле. Варианты: D, Dscore, K, Kscore, QB, QBscore, RB1, RB1score, RB2, RB2score, TE, TEscore, WR, WR1score, WR2, WR2score, author, author_id, id
ранее мой код в views.py > индекс def был
def index(request):
team = Myteam.objects.get()
Очевидно, что это получало все объекты в базе данных. Я понимаю, что мне нужно отфильтровывать по пользователю, но я просто не совсем уверен, как заставить это работать. Я ценю ваше время и внимание, если вы посмотрите на это.
Это мой класс user.
from django.contrib.auth.models import AbstractUser
from django.db import models
import datetime
class User(AbstractUser):
pass
Вот login.html
{% extends "game/layout.html" %}
{% block body %}
<div class="container">
<div class="card">
<div class="card-body">
<h2>Login</h2>
{% if message %}
<div>{{ message }}</div>
{% endif %}
<form action="{% url 'login' %}" method="post">
{% csrf_token %}
<div class="form-group">
<input autofocus class="form-control" type="text" name="username" placeholder="Username">
</div>
<div class="form-group">
<input class="form-control" type="password" name="password" placeholder="Password">
</div>
<input class="btn btn-primary btn-block" type="submit" value="Login">
</form>
<br>
Don't have an account? <a href="{% url 'register' %}">Register here.</a>
</div>
</div>
</div>
{% endblock %}
Комментарии:
1. Если вы запрашиваете
author=request.user.id
, почему stacktrace говорит, что:Cannot resolve keyword 'USER' into field.
? Вы копируете не результатMyteam.objects.filter(author=request.user.id)
, а что-то еще, вероятно, вы написалиMyteam.objects.filter(USER=request.user.id)
в своем коде.2. На самом деле. вы правы. Я вставил неправильный пример запроса. В нем должно быть написано team = Myteam.objects.filter(user=request.user.username)
Ответ №1:
Напишите свое представление таким образом
def index(request):
team = Myteam.objects.filter(author=request.user).first()
или
def index(request):
team = Myteam.objects.filter(author_id=request.user.id).first()
Комментарии:
1. Выдает мне объект AttributeError ‘QuerySet’, у которого нет атрибута ‘QB’
2. Я просто сообщаю, что происходит, когда я его пробую.
3. Ага! Это работает. Большое спасибо за вашу помощь. Когда я выхожу из системы, он также возвращает объект AttributError ‘NoneType’, у которого нет атрибута ‘QB’, вместо того, чтобы просто переходить к индексному URL. Как вы думаете, это связано с этим изменением?
4. Это происходит, когда нет команды, связанной с пользователем, потому что в этом случае набор запросов возвращает None . Вам нужно обработать это, создав соответствующую команду или отправив 404 пользователю. Это зависит от логики вашего приложения.
5. Спасибо. Имеет смысл. Читайте об этом сейчас.
Ответ №2:
Вы передаете идентификатор в поле имени.
Здесь: автор ссылается на поле пользователя.
Если вы хотите получить эту связанную команду для этого пользователя, сделайте так
team = Myteam.objects.filter(author_id=request.user.id)
or
team = Myteam.objects.filter(author=request.user)
Ответ №3:
Это просто…
Сначала получите свою User
модель.
from YourUserApp.model import User
Затем найдите своего пользователя, как показано ниже:
def index(request):
user = User.objects.get(username=username, password=password)
team = Myteam.objects.filter(author=user)
Выполнено…
Вы можете использовать свои собственные учетные данные, если у вас их нет username or password
.
Не могли бы вы вставить свою User
модель?
Используйте это:
from django.contrib.auth import authenticate, login
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
team = Myteam.objects.filter(author=user)
Если user = authenticate(username=username, password=password)
не работает, используйте user=request.user
или author_id=request.user.id