Приложение Django; идентификатор пользователя по умолчанию и поле модели 'ID трейдера' не равны
Я создаю приложение, позволяющее пользователям вводить данные о сделках с акциями, для ведения учета. Я использую стандартную модель Django User для входа и аутентификации. Я хочу, чтобы вошедший пользователь мог просматривать только свои собственные "Записи", которые являются моей моделью для записей по акциям. Для этого я создал в модели Entry отношение один ко многим с именем 'trader', которое указывает на идентификатор пользователя (они должны быть одинаковыми).
Однако после входа в систему я не вижу на экране НИ ОДНОЙ сделки, хотя они были введены. Я проверил базу данных, и Entry.trader.id - это тот же номер, что и User.id (1 в случае первого созданного пользователя). Очень странно.
Что я пробовал: Я попробовал удалить эту строку из моего класса views.py EntryView:
entries = Entry.objects.filter(trader_id=logged_in_user).order_by("entered_date")
и замените его на:
entries = Entry.objects.all()
Это работает (доказывает, что записи есть), но теперь показывает ВСЕ записи.
Мой models.py:
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
from django.urls import reverse
from django.utils.text import slugify
from django.contrib.auth.models import User
class Entry(models.Model):
ONEORB="1-Min ORB"
FIVEORB="5-Min ORB"
ABCD="ABCD"
REVERSAL="Reversal"
PROFIT="Profit"
LOSS="Loss"
RESULT_CHOICES = (
(PROFIT, "Profit"),
(LOSS, "Loss")
)
STRATEGY_CHOICES = (
(ONEORB,"1-Min ORB"),
(FIVEORB,"5-Min ORB"),
(ABCD,"ABCD"),
(REVERSAL,"Reversal")
)
entered_date=models.DateField(auto_now_add=True)
ticker=models.CharField(max_length=8, default="")
strategy=models.CharField(max_length=12, choices=STRATEGY_CHOICES, default="ONEORB")
result=models.CharField(max_length=6, choices=RESULT_CHOICES, default="PROFIT")
comments=models.TextField(max_length=300, blank=True)
image = models.ImageField(upload_to="", null=True, blank=True) #will save to default BASE_DIR which is 'uploads'
trader = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False, related_name="entries")
def __str__(self):
return f"{self.result} {self.entered_date}"
Мой views.py:
Мои записи.html (индексная страница):
{% extends 'base.html' %}
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% block title %}
Trading Journal
{% endblock title %}Trading Journal
{% block content %}
<form method="POST" enctype="multipart/form-data" action="/">
{% csrf_token %}
{{ form }}
<button>Submit</button>
</form>
<h1>Request.user.id:{{request.user.id}}</h1>
{% endblock content %}
{% block table %}
<table class="blueTable">
<thead>
<tr>
<th>Date</th>
<th>Ticker</th>
<th>Strategy</th>
<th>Result</th>
<th>Comments</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="5">
<div class="links"><a href="#">«</a> <a class="active" href="#">1</a> <a href="#">2</a> <a href="#">3</a> <a href="#">4</a> <a href="#">»</a></div>
</td>
</tr>
</tfoot>
<tbody>
{% for entry in entries %}
<tr>
<td><a href="{% url 'single-entry' entry.id %}">{{entry.entered_date}}</a></td><td>{{entry.ticker}}</td><td>{{entry.strategy}}</td><td>{{entry.result}}</td><td>{{entry.comments}}</td></tr>
{% endfor %}
</tbody>
</tr>
</table>
{% if request.user.is_authenticated %}
<a href="{% url 'logout' %}"><button>Logout</button></a>
{% endif %}
{% endblock table %}
Мой urls.py:
from django.urls import path
from django.contrib import admin
from . import views
from django.contrib.auth.views import LogoutView
urlpatterns = [
path("", views.EntryView.as_view(), name="index"),
path("entries/<int:pk>/delete", views.SingleEntryDeleteView.as_view(), name="single-entry-delete"),
path("entries/<int:pk>/", views.SingleEntryView, name="single-entry"),
path("register/", views.register, name="register"),
path("login/", views.LoginUserView.as_view(), name="login"),
path("logout/", views.LogoutView.as_view(next_page="login"), name="logout"),
path("admin/", admin.site.urls)
]
Мой forms.py:
from django import forms
from .models import Entry
# Authentication modules start here
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth.models import User
from django.forms.widgets import PasswordInput, TextInput
# Form to create a journal entry
class EntryForm(forms.ModelForm):
class Meta:
model=Entry
exclude = ["trader"]
# Create / register a user
class CreateUserForm(UserCreationForm):
class Meta:
model = User #default django User model
fields = ['username', 'email', 'password1', 'password2']
# Authenticate a user
class LoginForm(AuthenticationForm):
username = forms.CharField(widget=TextInput())
password = forms.CharField(widget=PasswordInput())