【问题标题】:Is my django post method even being called?我的 django post 方法甚至被调用了吗?
【发布时间】: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),我认为这可能是问题所在。
  • 已添加。我的错。

标签: python django


【解决方案1】:

您的表单正在重定向到您的索引页面,因为这是您在

中指出的内容
<form action="/" type="submit" method="post">

/ 转到您的索引页。尝试将其更改为:

<form action="#" type="submit" method="post">

# 会将其带到当前页面。 action 表单告诉您要将表单数据发送到哪个视图。 # 基本上意味着您所在的当前页面。如果您想将数据发送到另一个视图,您只需执行&lt;form action='{% url 'name_of_your_view' %} ...&gt;

【讨论】:

  • arg 太傻了!我不敢相信我错过了。关于为什么日志记录在 post() 中不起作用但在 get() 中的任何想法?
  • 我必须承认我不熟悉def get(self, request,):。您是否在浏览器中输入路径来执行获取请求,因为我没有看到任何指向该路径的链接?我的意思是任何发送到your_base_url/add-order-page 的东西都会作为获取请求到达该视图,因此它可以正常工作。
  • 我还没有真正充实这个项目的大部分内容。这是第一步。是的,我正在输入地址。另外,通过修复它(也就是删除它),似乎日志记录也被修复了。疯狂的一件小事怎么能打破这么多! TYVM!!
  • 相信我,我经历过太多次了!很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2021-08-08
  • 2012-11-16
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
相关资源
最近更新 更多