【发布时间】:2022-01-21 20:50:05
【问题描述】:
我正在尝试在 Django 中制作交易日志应用程序,但遇到了一些障碍。当单击提交按钮时,感觉就像我的 post 方法可能会在晚上被调用。我尝试过打印和记录,但从未在 post() 方法中触发。日志记录在 get() 方法中工作正常。此外,即使我正在渲染 trading_log/add-order.html,我也会继续被路由回我的基本索引页面。我也尝试过使用 HTTPResponseRedirect。两者都无济于事。在这一点上,我真的不确定自己做错了什么。
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 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(来自landing_page 应用)
from django.urls import path
from . import views
urlpatterns = [
path("", views.starting_page, name="starting-page"),
]
urls.py(来自 trading_log 应用)
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"
}
模板: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 class="form-control {% if field.errors %}errors{% endif %}" >
{{ field.label_tag }}
{{ field }}
{{ field.errors }}
</div>
{% endfor %}
{% for field in trade_form %}
<div class="form-control {% if field.errors %}errors{% endif %}" >
{{ field.label_tag }}
{{ field }}
{{ field.errors }}
</div>
{% endfor %}
<button>Send</button>
</form>
{% endblock %}
【问题讨论】:
-
我现在要快速浏览一下,但是是的,您应该始终在此处发布的是实际代码(链接可能会变为非活动状态或更改)。根据您的问题,我认为您的相关
views.py、代码、带有表单的模板以及您的urls.py。 -
添加了您请求的所有内容,包括来自根应用程序和landing_page 应用程序的 urls 文件。我还添加了 settings.py 以防万一,因为此时那里没有敏感信息。感谢您的回复!
-
不要忘记模板(html),我认为这可能是问题所在。
-
已添加。我的错。