代码之家  ›  专栏  ›  技术社区  ›  SqueezeOJ

如何在一个项目中的Django文件之间共享数据?

  •  0
  • SqueezeOJ  · 技术社区  · 5 年前

    我是一个Django新手,所以我试图通过在Pythonywhere上慢慢建立自己的费用和收入网站来学习。

    它工作得很好。。。除了一件事: 主页可以从我的费用表中提取数据,但不能从我的收入表中提取数据。没有错误,它只返回零条记录。

    我确信这个问题与我将收入相关的项目放在一个单独的income.py文件中有关。我不想将收入资料合并到更大的views.py文件中。

    您能否就如何从views.py中的HomePageView访问收入表数据给我一些建议?

    谢谢,杰森

    Django场地结构:

    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:

    # ===============================================================================
    # 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:

    # ===============================================================================
    # 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),
    ]
    
    0 回复  |  直到 5 年前