I am trying to make a trading log app in Django but I have run into a few snags. It feels like my post method might night be being called when the submit button is clicked. I have tried printing and logging and neither ever fire in the post() method. The logging works fine in the get() method. Additionally I keep being routed back to my base index page even though I am rendering trading_log/add-order.html. I have also tried using a HTTPResponseRedirect. Both to no avail. I am really not sure what I am doing wrong at this point.
Settings.py
"""
Django settings for caspers_trading_tools project.
Generated by 'django-admin startproject' using Django 4.0.1.
For more information on this file, see
https://docs.djangoproject.com/en/4.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.0/ref/settings/
"""
from pathlib import Path
import os
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-d^@mw27((%t$wzj 3eykdmfmweufzep44sgkhib)^n1thdh!y6'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'landing_page',
'trading_log',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'caspers_trading_tools.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
BASE_DIR / "templates",
BASE_DIR / "templates" / "includes"
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'caspers_trading_tools.wsgi.application'
# Database
# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/4.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.0/howto/static-files/
STATIC_URL = 'static/'
STATICFILES_DIRS = [
BASE_DIR / "static"
]
# Default primary key field type
# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '.\\logs\\tradinglog_log.log',
}
},
'loggers': {
'': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
urls.py(from root app)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path("", include("landing_page.urls")),
path("tradinglog/", include("trading_log.urls"))
]
urls.py(from landing_page app)
from django.urls import path
from . import views
urlpatterns = [
path("", views.starting_page, name="starting-page"),
]
urls.py(from trading_log app)
from django.urls import path
from . import views
urlpatterns = [
path("", views.trading_log_starting_page, name="trading-log-page"),
path("all-orders", views.OrdersListView.as_view()),
path("all-trades", views.TradesListView.as_view(), name="all-trades-page"),
path("add-order", views.CreateOrderView.as_view(), name="add-order-page"),
path("add-trade", views.CreateTradeView.as_view())
]
views.py
from trading_log.forms import CreateOrderForm
from django.shortcuts import render
from django.views.generic import ListView, View
from django.http.response import HttpResponseRedirect
from django.urls import reverse
from django.utils.text import slugify
import logging
import uuid
from .forms import CreateTradeForm
from .models import Trade, Order
# Create your views here.
class TradesListView(ListView):
template_name = "trading_log/all-trades.html"
model = Trade
context_object_name = "trades"
def get_queryset(self):
request = self.request
# this should be removed once user_ids are implemented through Django's built in user registration and login
request.session["user_id"] = 1
user_id = request.session.get("user_id")
filtered_data = super().get_queryset().filter(user_id=user_id)
return filtered_data
class OrdersListView(ListView):
template_name = "trading_log/all-orders.html"
model = Order
context_object_name = "orders"
def get_queryset(self):
request = self.request
# this should be removed once user_ids are implemented through login system and session creation
request.session["user_id"] = 1
user_id = request.session.get("user_id")
filtered_data = super().get_queryset().filter(user_id=user_id)
return filtered_data
# Creates order view
class CreateTradeView(View):
def get(self, request,):
form = CreateTradeForm()
return render(request, "trading_log/add-trade.html", {"form": form})
def post(self, request):
pass
# Creates order view
class CreateOrderView(View):
def get(self, request,):
logging.debug("TEST")
# this should be removed once user_ids are implemented through login system and session creation
request.session["user_id"] = 1
# should be set to session.get("user_id") probably in the future
user_id = request.session.get("user_id")
trade_form = CreateTradeForm()
order_form = CreateOrderForm()
context = {}
context["user_id"] = user_id
context["order_form"] = order_form
context["trade_form"] = trade_form
return render(request, "trading_log/add-order.html", context)
def post(self, request):
logging.debug("DSFSDFSDFSFD")
logging.error("Error test TEST")
logging.critical("Error test TEST 2")
# section commented out to try and resolve the lack of logging in post()
# trade_form = CreateTradeView(request.POST)
# order_form = CreateOrderForm(request.POST)
# trade = trade_form.save(commit=False)
# order = order_form.save(commit=False)
# trade.user_id = request.session.get("user_id")
# trade.setup_id = request.POST.get("setup_id")
# trade.notes = request.POST.get("notes")
# slug = slugify(str(trade.user_id) str(trade.setup_id.name)
# str(order.asset_id.name) uuid.uuid4())
# trade.trade_slug = slugify(slug)
# logging.info("TRADE", trade)
# logging.info("ORDER", order)
# return HttpResponseRedirect(reverse("add-order-page"))
return render(request, "trading_log/add-order.html")
def trading_log_starting_page(request):
all_trades = Trade.objects.all()
return render(request, "trading_log/index.html", {
"all_trades": all_trades
})
forms.py
from django import forms
from django.forms import ModelForm
from .models import Order, Trade
class DateInput(forms.DateTimeInput):
input_type = "datetime-local"
class CreateOrderForm(forms.ModelForm):
class Meta:
model = Order
fields = ['asset_id', 'direction_id', 'num_contracts', 'contract_id', 'order_type_id',
'price', 'datetime', 'time_frame_id', 'chart_screenshot', 'notes', 'trade_id', 'order_slug']
widgets = {
'datetime': DateInput(),
}
labels = {
'asset_id': 'Asset',
'direction_id': 'Direction',
'contract_name_id': 'Contract Name',
'num_contracts': 'Number of Contracts',
'order_type_id': 'Order Type',
'datetime': 'Date Time',
'time_frame_id': 'Time Frame',
'chart_screenshot': 'Chart Screenshot',
}
class CreateTradeForm(forms.ModelForm):
class Meta:
model = Trade
fields = ['setup_id', 'notes']
labels = {
"setup_id": "Setup",
"notes": "Overall Trade Notes"
}
template: add-order.html
{% extends "base.html" %}
{% load static %}
{% block title %}Add Order{% endblock %}
{% block css_files %}
{% endblock %}
{% block content %}
<form action="/" type="submit" method="post">
{% csrf_token %}
{% for field in order_form %}
<div >
{{ field.label_tag }}
{{ field }}
{{ field.errors }}
</div>
{% endfor %}
{% for field in trade_form %}
<div >
{{ field.label_tag }}
{{ field }}
{{ field.errors }}
</div>
{% endfor %}
<button>Send</button>
</form>
{% endblock %}
CodePudding user response:
Your form is redirecting to your index page, because that's what you've indicated in
<form action="/" type="submit" method="post">
The / goes to your index page. Try changing it to:
<form action="#" type="submit" method="post">
The # will take it to the current page. The form action is what tells which view you want the form data to be sent to. The # basically means just the current page you're on. If you wanted to send the data to another view you would simply do <form action='{% url 'name_of_your_view' %} ...>
