Django: как отображать содержимое, созданное пользователем, только тому же пользователю?

#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