如何在一个项目中的Django文件之间共享数据?
我是一个Django新手,所以我试图通过在Pythonywhere上慢慢建立自己的费用和收入网站来学习 我知道我的项目没有适当的规格,但它工作得非常好。。。除了一件事:主页可以从我的费用表中提取数据,但不能从我的收入表中提取数据。没有错误,它只返回零条记录。 我确信这个问题与我将收入相关的项目放在一个单独的income.py文件中有关。我不想将收入资料合并到更大的views.py文件中 关于如何从views.py中的HomePageView访问收入表数据,您能给我一些建议吗? 谢谢,杰森 Django场地结构: views.py: URL.py:如何在一个项目中的Django文件之间共享数据?,django,django-models,Django,Django Models,我是一个Django新手,所以我试图通过在Pythonywhere上慢慢建立自己的费用和收入网站来学习 我知道我的项目没有适当的规格,但它工作得非常好。。。除了一件事:主页可以从我的费用表中提取数据,但不能从我的收入表中提取数据。没有错误,它只返回零条记录。 我确信这个问题与我将收入相关的项目放在一个单独的income.py文件中有关。我不想将收入资料合并到更大的views.py文件中 关于如何从views.py中的HomePageView访问收入表数据,您能给我一些建议吗? 谢谢,杰森 Dja
如果查询没有返回任何记录,则表明数据库中没有与条件匹配的记录。尝试使用manage.py shell对查询进行实验,看看为什么它的行为可能与您期望的不一样。@Glenn:您是对的!views.py中的end_range变量设置为last_year而不是current_year,这排除了我需要的记录。谢谢你的帮助!如果你把这个作为一个答案,那么我很乐意选择它。
Django01
---Django01
__init__.py
asgi.py
income.py # created later, contains income_list(request)
models.py # contains definitions for both an Expenses table and an Income table
settings.py
urls.py # holds all urls for site
views.py # contains HomePageView(TemplateView) and expense_list(request)
wsgi.py
---static
---templates
---Django01
base.html
expenses_list.html
home.html # Page where I'd like to access BOTH Expense and Income table
incomes_list.html
# ===============================================================================
# views.py
# ===============================================================================
from django.views.generic import TemplateView
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect
from .models import Expenses, Income
from datetime import date, datetime
from django.db.models import Count, Sum
# ------------------------------------------------------------------------------
# Home Page
# ------------------------------------------------------------------------------
class HomePageView(TemplateView):
template_name = 'home.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['base_template'] = "base.html"
# Create Date Range (Today - 2 Years)
todays_date = date.today()
current_year = todays_date.year
last_year = int(current_year) - 1
start_range = str(last_year) + "-01-01"
end_range = str(last_year) + "-12-31"
# Create Frequent Expense Sellers List <--- WORKS GREAT!
sellers_recordset = Expenses.objects.filter(xdate__range=[start_range, end_range]).values('xseller','xcategory').exclude(xseller__exact='').annotate(count=Count('xseller')).order_by('-count', 'xseller')[:10:1]
context['sellers_list'] = sellers_recordset
# Create Frequent Income Sources List <--- NOT WORKING. RETURNS EMPTY, NO ERROR, WHY???
payers_recordset = Income.objects.filter(idate__range=[start_range, end_range]).values('ipayer','isource').exclude(ipayer__exact='').annotate(count=Count('ipayer')).order_by('-count', 'ipayer')[:10:1]
context['payers_list'] = payers_recordset
return context
# ------------------------------------------------------------------------------
# Expense List Page <--- WORKS GREAT!
# ------------------------------------------------------------------------------
@login_required
def expense_list(request):
# Are there Parameters in HTTP Query String?
param_year = request.GET.get('year','')
param_seller = request.GET.get('seller','')
param_category = request.GET.get('category','')
param_vacation = request.GET.get('vacation','')
# Set Default Years
todays_date = date.today()
current_year = todays_date.year
next_year = current_year + 1
previous_year = current_year - 1
# Filter Expenses based on Parameters
if param_year != "":
current_year = int(param_year)
next_year = current_year + 1
previous_year = current_year - 1
start_range = str(current_year) + "-01-01"
end_range = str(current_year) + "-12-31"
expense_recordset = Expenses.objects.filter(xdate__range=[start_range, end_range]).order_by('-xdate')
show_year = True
elif param_seller != "":
expense_recordset = Expenses.objects.filter(xseller=param_seller).order_by('-xdate')
show_year = False
elif param_category != "":
expense_recordset = Expenses.objects.filter(xcategory=param_category).order_by('-xdate')
show_year = False
elif param_vacation != "":
expense_recordset = Expenses.objects.filter(xvacation=param_vacation).order_by('-xdate')
show_year = False
else:
expense_recordset = Expenses.objects.filter(xdate__gte="2021-01-01").order_by('-xdate')
show_year = True
# Get Count & Totals
expense_count = expense_recordset.all().count()
expense_total = expense_recordset.all().aggregate(Sum('xamount')).get('xamount__sum', 0.00)
# Create Context to Send to Template
context = {
'base_template' : "base.html",
'show_year' : show_year,
'next_year' : next_year,
'current_year' : current_year,
'previous_year' : previous_year,
'expense_count' : expense_count,
'expense_list' : expense_recordset,
'expense_total' : expense_total
}
return render(request, 'expense_list.html', context=context)
# ===============================================================================
# income.py
# ===============================================================================
from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect
from django.contrib.auth.decorators import login_required
from .models import Income
from datetime import datetime, date
from django.db.models import Count, Sum
# ------------------------------------------------------------------------------
# Incomes List Page <--- WORKS GREAT!
# ------------------------------------------------------------------------------
@login_required
def income_list(request):
# Are there Parameters in HTTP Query String?
param_year = request.GET.get('year','')
param_payer = request.GET.get('payer','')
param_source = request.GET.get('source','')
# Set Default Years
todays_date = date.today()
current_year = todays_date.year
next_year = current_year + 1
previous_year = current_year - 1
# Filter Income based on Parameters
if param_year != "":
current_year = int(param_year)
next_year = current_year + 1
previous_year = current_year - 1
start_range = str(current_year) + "-01-01"
end_range = str(current_year) + "-12-31"
income_recordset = Income.objects.filter(idate__range=[start_range, end_range]).order_by('-idate')
show_year = True
elif param_payer != "":
income_recordset = Income.objects.filter(ipayer=param_payer).order_by('-idate')
show_year = False
elif param_source != "":
income_recordset = Income.objects.filter(isource=param_source).order_by('-idate')
show_year = False
else:
income_recordset = Income.objects.filter(idate__gte='2021-01-01').order_by('-idate')
show_year = True
# Get Count & Totals
income_count = income_recordset.all().count()
income_total = income_recordset.all().aggregate(Sum('iamount')).get('iamount__sum', 0.00)
# Create Context to Send to Template
context = {
'base_template' : "base.html",
'show_year' : show_year,
'next_year' : next_year,
'current_year' : current_year,
'previous_year' : previous_year,
'income_count' : income_count,
'income_list' : income_recordset,
'income_total' : income_total
}
return render(request, 'income_list.html', context=context)
# ===============================================================================
# models.py
# ===============================================================================
from django.db import models
from django.urls import reverse
# -------------------------------------------------------------------------------
# Expenses Table
# -------------------------------------------------------------------------------
class Expenses(models.Model):
# Fields
xid = models.AutoField(db_column='xID', primary_key=True) # Field name made lowercase.
xdate = models.DateTimeField(db_column='xDate', blank=True, null=True) # Field name made lowercase.
xseller = models.CharField(db_column='xSeller', max_length=50, blank=True, null=True) # Field name made lowercase.
xamount = models.DecimalField(db_column='xAmount', max_digits=10, decimal_places=3, blank=True, null=True) # Field name made lowercase.
xcategory = models.CharField(db_column='xCategory', max_length=50, blank=True, null=True) # Field name made lowercase.
xwith = models.CharField(db_column='xWith', max_length=50, blank=True, null=True) # Field name made lowercase.
xpresent = models.CharField(db_column='xPresent', max_length=50, blank=True, null=True) # Field name made lowercase.
xvacation = models.CharField(db_column='xVacation', max_length=50, blank=True, null=True) # Field name made lowercase.
xnotes = models.CharField(db_column='xNotes', max_length=300, blank=True, null=True) # Field name made lowercase.
# Metadata
class Meta:
managed = False
db_table = 'Expenses'
app_label = 'Expenses' # Added to Alleviate RunTime Error
# Methods
def get_absolute_url(self):
"""Returns the url to access a particular instance of MyModelName."""
return reverse('model-detail-view', args=[str(self.id)])
def __str__(self):
"""String for representing the MyModelName object (in Admin site etc.)."""
return self.my_field_name
# -------------------------------------------------------------------------------
# Income Table
# -------------------------------------------------------------------------------
class Income(models.Model):
# Fields
iid = models.AutoField(db_column='iID', primary_key=True) # Field name made lowercase.
idate = models.DateTimeField(db_column='iDate', blank=True, null=True) # Field name made lowercase.
ipayer = models.CharField(db_column='iPayer', max_length=50, blank=True, null=True) # Field name made lowercase.
iamount = models.DecimalField(db_column='iAmount', max_digits=10, decimal_places=3, blank=True, null=True) # Field name made lowercase.
isource = models.CharField(db_column='iSource', max_length=50, blank=True, null=True) # Field name made lowercase.
inotes = models.CharField(db_column='iNotes', max_length=300, blank=True, null=True) # Field name made lowercase.
# Metadata
class Meta:
managed = False
db_table = 'Income'
app_label = 'Expenses' # Added to Alleviate RunTime Error
# Methods
def get_absolute_url(self):
"""Returns the url to access a particular instance of MyModelName."""
return reverse('model-detail-view', args=[str(self.id)])
def __str__(self):
"""String for representing the MyModelName object (in Admin site etc.)."""
return self.my_field_name
# ===============================================================================
# urls.py
# ===============================================================================
from django.contrib import admin
from django.urls import path, include
from .views import HomePageView, expense_list
from .income import income_list
urlpatterns = [
path('', HomePageView.as_view(), name='home'),
path('expense_list/', expense_list, name='expense_list'),
path('income_list/', income_list, name='income_list'),
path('accounts/', include('django.contrib.auth.urls')),
path('admin/', admin.site.urls),
]