Home > Mobile >  Is my django post method even being called?
Is my django post method even being called?

Time:01-22

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' %} ...>

  •  Tags:  
  • Related