상세 컨텐츠

본문 제목

Django_자산관리 Web Program Project_01

Django

by Digit_Kim 2023. 11. 7. 17:06

본문

  내가 지금 하고 있는 자산관리 Web Program 개발 관련하여 전체적으로 정리하기 시작했다. 순서와 방식은 차차 해 나가면서 보완하면 될 것 같다. 기본적인 부분은 가볍게 건너뛰고 실제 코딩에 필요한 사항들 위주로 정리를 한다.

 

  - 첫단계로, 프로젝트 전반에 대한 구상을 한다.

    : 사실 이 단계를 머릿속에서만 했다. 그러다 보니 많은 시행착오속에서 불필요한 파일들이 생성되고 지워지기도 하면서 초반에 혼란스러운 기간이 있었는데, 지금은 대체적으로 머릿속으로도, 프로젝트상의 Directory상으로도 나름 가볍게 정리된 것 같다. 시간날 때 이 부분은 좀 더 상세하게 구체화할 필요가 있겠다.

 

  - Django Project 생성하기.

    1. 일단 개발 운영할 폴더를 만든다.  (나의 경우,  C:\Users\SUNJIN\PycharmProjects\Djangopro\)

    2. 장고 패키지를 설치한다. (terminal에서 pip install django)

    3. 프로젝트를 생성한다.  ( terminal 에서 django-admin startproject 프로젝트명[나의 경우 DJANGO_PLOTLY] )

    4. 앱을 생성한다. (앱은 여러개 만들 수 있다) (  terminal 에서 python manage.py startapp 앱이름 [나의 경우 core] )

 

이런 과정을 거치다 보면 개발 폴더안에 프로젝트 폴더(DJANGO_PLOTLY)가 생기고 그 안에 앱 폴더(core)가 생긴다.

 

그 안에 여러 폴더와 파일들이 생기는데, 우선 프로젝트 전반을 관장하는 파일들이 있는 폴더(DJANGO_PLOTLY)가 프로젝트name과 동일한 이름으로 생성되며 그 안에 주요 파일들이 있다.

 

첫번째로 setting.py에 기본적인 사항을 포함하여 현재까지 내가 추가한 내용들은 다음과 같다. 

from pathlib import Path
import os

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = 'django-insecure-60$*w@i1j20!7%jsk0%z6-ebbi#3(d6wor8^l$rm8l%h(s0oa='

DEBUG = True

ALLOWED_HOSTS = []


# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.humanize',
    'core',
    'fltformat_filter',
]

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 = 'DJANGO_PLOTLY.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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',
            ],
            'libraries': {
                'custom_filters': 'core.templatetags.custom_filters',
            },
        },
    },
]

WSGI_APPLICATION = 'DJANGO_PLOTLY.wsgi.application'


# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases

DATABASES = {
    'default': {
         'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'commu_django',
        'USER': 'postgres',
        'PASSWORD': 'k********',
        'HOST': '127.0.0.1',
        'PORT': '5432'
    }
}


# Password validation
# https://docs.djangoproject.com/en/4.2/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.2/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.2/howto/static-files/

STATIC_URL = 'static/'
STATICFILES_DIRS=[BASE_DIR / 'static']

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

DATE_FORMAT = '%Y-%m-%d'

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'

 

 

다음으로 urls.py가 있다. 사용할 app에 같은 이름의 파일 urls.py를 만들어야 하고, 여기서는 그것과 연결해 주는 역할을 명기한다.

from django.contrib import admin
from django.urls import include, path
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('core.urls')),
    path('', include('Person.urls')),
    path('', include('Car.urls')),

] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

 

해당폴더안에 추가적으로  [static] , [templates] 폴더를 만든다. [static]안에는 api, css, img, js 등의 폴더를 만들고 관련 파일을 그곳에 저장하여 향후 app을 만들때에 연동해서 사용한다. [templates]폴더안에는 app 이름을 가진 폴더를 만들고 그 안에 보통 html 파일등을 놓아두는데, 나는 여기에 하지 않고, 해당 app폴더로 가서, 거기에 [templates]폴더를 다시 만들고 그 안에 app이름 그리고 그 안에 개발하는 html 파일들을 넣어둔다. (나의 경우 C:\Users\SUNJIN\PycharmProjects\Djangopro\DJANGO_PLOTLY\core\templates\core)

 

처음에 app(나의 경우 app이름 core)을 만들게 되면, 여러 가지 파일들이 생성된다.

 

models.py는 DB 테이블을 만드는 곳이다. (아래는 현재까지 내가 만든 DB 테이블들)

from django.db import models
from django.contrib.auth.models import User


# Create your models here.
class Itemcode(models.Model):
    codenum = models.CharField(primary_key=True)
    codename=models.CharField(max_length=30)
    market=models.CharField(max_length=6)
    industry = models.CharField(max_length=20)

    def __str__(self):
        return self.codename
    
class I_User(models.Model):
    name = models.CharField(max_length=20)
    def __str__(self):
        return self.name

class Invester(models.Model):
    user = models.CharField(max_length=20)
    kind = models.CharField(max_length=20, null=True)
    corpname=models.CharField(max_length=20)
    account=models.CharField(max_length=30)
    cma=models.BooleanField(default=False)

    def __str__(self):
        return self.account

class Purchasing(models.Model):
    p_id=models.IntegerField(primary_key=True)
    date = models.DateField()
    kind = models.CharField(max_length=20)
    pname = models.CharField(max_length=30)
    accountnum =models.CharField(max_length=30)
    codename = models.CharField(max_length=30)
    amount = models.IntegerField(default=1)
    price = models.IntegerField(default=1)

class Inventories(models.Model):
    I_no=models.IntegerField(primary_key=True)
    date = models.DateField()
    kind = models.CharField(max_length=20)
    name = models.CharField(max_length=30)
    accountnum =models.CharField(max_length=30)
    codename = models.CharField(max_length=30)
    amount = models.IntegerField(default=1)
    price = models.IntegerField(default=1)

class Selling(models.Model):
    s_id=models.IntegerField(primary_key=True)
    kind = models.CharField(max_length=20)
    date = models.DateField()
    name = models.ForeignKey(I_User, on_delete=models.CASCADE)
    accountnum =models.CharField(max_length=30)
    codename = models.CharField(max_length=30)
    amount = models.IntegerField(default=1)
    price = models.IntegerField(default=0)
    profit= models.IntegerField(default=0)
    p_price = models.IntegerField(default=0)

class Kind(models.Model):
    name = models.CharField(max_length=20)

    def __str__(self):
        return self.name

class Anal_Item(models.Model):
    sep = models.CharField(max_length=10)
    sep_no = models.CharField(max_length=3)
    item=models.CharField(max_length=30)

class Profiting(models.Model):
    no = models.IntegerField(primary_key=True)
    date=models.DateField()
    name=models.CharField(max_length=20)
    invest=models.IntegerField()
    codename=models.CharField(max_length=30)
    profit=models.IntegerField()

class Stock_daily_price(models.Model):
    date=models.DateField()
    codenum=models.CharField(max_length=20)
    price=models.IntegerField()
    amount=models.IntegerField()

class Transfering(models.Model):
    no=models.IntegerField(primary_key=True)
    date = models.DateField()
    s_account = models.CharField(max_length=30)
    r_account =models.CharField(max_length=30)
    price = models.IntegerField(default=1)

class Fixture(models.Model):
    team1 = models.CharField(max_length=128)
    team2 = models.CharField(max_length=128)
    team1_goals = models.IntegerField()
    team2_goals = models.IntegerField()

class SearchList(models.Model):
    post_title = models.CharField(max_length = 200)
    posting_date = models.CharField(max_length = 100)
    blog_url = models.CharField(max_length = 500)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    class Meta:
        db_table = 'search_lists'

class CO2(models.Model):
    date = models.DateField()
    average = models.FloatField()

    class Meta:
        ordering = ('date',)

 

admin.py 는 models.py에서 만든 db 테이블을 웹에서 편집, 저장, 삭제 등을 할 수 있도록 연결해 주는 역할을 하는데, 이곳에 등록되어 있으면, 구태여 DB 서버에서 작업하지 않고도 웹페이지 admin url에서 일부를 수정할 수 있다.

from itertools import product
from django.contrib import admin
from . import models

class InvesterAdmin(admin.ModelAdmin):
    list_display = ('user','corpname','account')

class PurchaseAdmin(admin.ModelAdmin):
    list_display = ('date','pname','accountnum','codename','price','kind')

class ProfitAdmin(admin.ModelAdmin):
    list_display = ('date','name','codename','profit')

class SellAdmin(admin.ModelAdmin):
    list_display = ('date','name','accountnum','kind','codename','price')

class InventoryAdmin(admin.ModelAdmin):
    list_display = ('I_no', 'date','accountnum','kind','codename','price')

class Anal_ItemAdmin(admin.ModelAdmin):
    list_display = ('sep','sep_no','item')

class TransAdmin(admin.ModelAdmin):
    list_display = ('date','s_account','r_account')

admin.site.register(models.I_User)
admin.site.register(models.Invester,InvesterAdmin)
admin.site.register(models.Purchasing,PurchaseAdmin)
admin.site.register(models.Profiting,ProfitAdmin)
admin.site.register(models.Selling,SellAdmin)
admin.site.register(models.Inventories,InventoryAdmin)
admin.site.register(models.Itemcode)
admin.site.register(models.Kind)
admin.site.register(models.Anal_Item,Anal_ItemAdmin)
admin.site.register(models.Stock_daily_price)
admin.site.register(models.Transfering,TransAdmin)

admin.site.register(models.SearchList)
admin.site.register(models.Fixture)
admin.site.register(models.CO2)

 

 

views.py는 백엔드의 역할로 서버(DB)와 클라이언트(여기서는 웹페이지 Html)을 연결해 주는 역할을 한다. 내꺼는 현재 하나의 app을 쓰고 있어서 여기에 모든 코딩이 다 들어 있다. 여기에는 일부만 표시한다. 나중에는 app을 구분하여 간단하고 명료하게 정리할 계획이다.

from django.shortcuts import render,redirect, get_object_or_404
import plotly.express as px
from django.db.models import Sum,Avg,Count,F,Q,FloatField,ExpressionWrapper,Max ,CharField,Value,Case,When,DecimalField
from core.forms import Date_Form,Purchase_Form,MyModelForm
from .models import CO2, Profiting, SearchList, Itemcode, Fixture, Invester, Purchasing, I_User, Kind, Selling, Anal_Item, Inventories,Stock_daily_price,Transfering
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage
from django.urls import reverse
from django.contrib import auth,messages
from django.contrib.auth.models import User
from django.db.utils import IntegrityError
import json
from django.http import JsonResponse,HttpResponse
from django.views import View
from bs4 import BeautifulSoup
from core.management.load_data import Command
import requests
from datetime import datetime,date,timedelta
from django.db.models.functions import ExtractYear, ExtractMonth, Concat
from bs4 import BeautifulSoup
import matplotlib
matplotlib.use('Agg') #백앤드 설정
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
import io
import base64
from pandas_datareader import data as pdr
import pandas as pd
import numpy as np
import pyupbit
import hashlib, uuid,jwt
from urllib.parse import urlencode




def home(request):

    item = Itemcode.objects.all()
    if not item:
        Comd = Command()
        Comd.itemregi()

    profit = Profiting.objects.all()
    if not profit:
        Comd = Command()
        Comd.stockregi()

    record1 = Stock_daily_price.objects.all().latest('date')
    date=record1.date.strftime('%Y-%m-%d')
    context={
        'date':date,
    }

    return render(request,'core/home.html',context)

def get_html_whether(request):
    city = request.GET.get('city')
    city = city.replace(" ", "+")
    USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"
    LANGUAGE = "en-US,en;q=0.5"
    session = requests.Session()
    session.headers['User-Agent'] = USER_AGENT
    session.headers['Accept-Language'] = LANGUAGE
    session.headers['Content-Language'] = LANGUAGE
    html_content = session.get(f'https://www.google.com/search?q=weather+{city}').text
    return html_content


def whether(request):
    result = None
    if 'city' in request.GET:
        # fetch the weather from Google.
        html_content = get_html_whether(request)
        soup = BeautifulSoup(html_content, 'html.parser')

        result = dict()
        # extract region
        result['region'] = soup.find("span", attrs={"class": "BNeawe tAd8D AP7Wnd"}).text
        # extract temperature now
        result['temp_now'] = soup.find("div", attrs={"class": "BNeawe iBp4i AP7Wnd"}).text
        # get the day, hour and actual weather
        result['dayhour']= result['weather_now'] = soup.find("div", attrs={"class": "BNeawe tAd8D AP7Wnd"}).text.split(
            '\n')
    return render(request, 'core/whether.html', {'result': result})

def w_chart(request):
    start = request.GET.get('start')
    end = request.GET.get('end')

    co2 = CO2.objects.all()
    if not co2:
        Comd=Command()
        Comd.co2handle()

    if start:
        co2 = co2.filter(date__gte=start)
    if end:
        co2 = co2.filter(date__lte=end)

    fig = px.line(
        x=[c.date for c in co2],
        y=[c.average for c in co2],
        title="CO2 PPM",
        labels={'x': 'Date', 'y': 'CO2 PPM'}
    )

    fig.update_layout(
        title={
            'font_size': 24,
            'xanchor': 'center',
            'x': 0.5
        })
    chart = fig.to_html()
    context = {'chart': chart, 'form': Date_Form()}
    return render(request, 'core/w_chart.html', context)

def yearly_avg_co2(request):
    averages=CO2.objects.values('date__year').annotate(avg=Avg('average'))
    x=averages.values_list('date__year',flat=True)
    y=averages.values_list('avg',flat=True)

    text=[f'{avg:.0f}' for avg in y]

    fig=px.bar(x=x,y=y,text=text)
    fig.update_layout(
        title_text='Average CO2 concentration per year',
        yaxis_range=[0,500]
    )
    fig.update_traces(textfont_size=12, textangle=0, textposition='outside',cliponaxis=False)

    chart=fig.to_html()
    context={'chart':chart}
    return render(request,'core/w_chart.html',context)

def get_html_jusik(codenum):
     
    USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"
    LANGUAGE = "en-US,en;q=0.5"
    session = requests.Session()
    session.headers['User-Agent'] = USER_AGENT
    session.headers['Accept-Language'] = LANGUAGE
    session.headers['Content-Language'] = LANGUAGE
    html_content = session.get(f'https://finance.naver.com/item/main.naver?code={codenum}').text
    return html_content


def Jusik(request):
    result = None
    if 'item' in request.GET:
        item = Itemcode.objects.get(codename=request.GET.get('item'))
        codenum=item.codenum

        html_content = get_html_jusik(codenum)
        soup = BeautifulSoup(html_content, 'html.parser')

        result = dict()
        result['company'] = soup.find("div", {"class": "wrap_company"}).find("h2").text
        result['code'] = soup.find("span", {"class": "code"}).text.strip()
        result['price'] = soup.find("p", {"class": "no_today"}).find("span", {"class": "blind"}).text
        result['yesterday_price']= soup.find("td", {"class": "first"}).find("span", {"class": "blind"}).text
        result['date'] = soup.find("em", attrs={"class": "date"}).get_text()
        result['gap']=int(result['price'].replace(",","")) -int(result['yesterday_price'].replace(",",""))

    return render(request, 'core/jusik.html', {'result': result})

...
...
..
...

 

urls.py 는 웹페이지와 views.py를 직접 연결시켜주는 고리 역할을 한다.

from django.urls import path
from . import views
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('', views.home),
    path('w_chart/', views.w_chart, name='w_chart'),
    path('c/', views.yearly_avg_co2, name='chart1'),
    path('chart_profit/', views.chart_profit, name='chart_profit'),
    path('anal_profit_chart/', views.anal_profit_chart, name='anal_profit_chart'),    
    path('list_profit/1', views.yearly_avg_p, name='p_chart1'),

    path('eval_stock/', views.eval_stock, name='eval_stock'),
    path('eval_stock_code/', views.eval_stock_code, name='eval_stock_code'),
    path('showing_stock/', views.showing_stock, name='showing_stock'),
    path('eval_eachcode/', views.eval_eachcode, name='eval_eachcode'),
    path('save_stock_data/', views.save_stock_data, name='save_stock_data'),
    path('record_stock_data/', views.record_stock_data, name='record_stock_data'),
    path('update_stock_data/', views.update_stock_data, name='update_stock_data'),
    path('timing_stock/', views.timing_stock, name='timing_stock'),
    path('time_series_stock/', views.time_series_stock, name='time_series_stock'),
    path('time_series3_stock/', views.time_series3_stock, name='time_series3_stock'),
    
    path('home/', views.home, name='home'),
    path("login/", auth_views.LoginView.as_view(template_name="core/login.html"), name="login"),
    path("logout/", auth_views.LogoutView.as_view(), name="logout"),
    path('signup/', views.signup, name='signup'),
    path('users-json/', views.get_user_data, name='users-json'),    
        
    path('list/', views.listraw, name='list'),
    path('anal_profit/', views.anal_profit, name='anal_profit'),
    path('list_profit/', views.list_profit, name='list_profit'),
    
    path("update_profit/",views.update_profit, name="update_profit"),
    path("del_profit/", views.del_profit, name="del_profit"),
    
    path('anal_asset/', views.anal_asset, name='anal_asset'),
    path('list_asset/', views.list_asset, name='list_asset'),
    path('post-asset-anal/', views.post_asset_anal, name='post-asset-data'),
    path('get-asset-anal/', views.get_asset_anal, name='get-data'),
    path('models-json/<str:user>/', views.get_json_asset_anal, name='models-json'),
    path('anal_name_filter/', views.anal_name_filter, name='anal_name_filter'),
    path('anal_popup/', views.anal_popup, name='anal_popup'),

    path("update_asset/", views.update_asset, name="update_asset"),
    path("searching_update_asset/", views.searching_update_asset, name="searching_update_asset"),
    path("del_asset/",views.del_asset, name="del_asset"),
    

    path('transfer_account/', views.transfer_account, name='transfer_account'),
    path('transfering_value/', views.transfering_value, name='transfering_value'),
    path('transfering_save/', views.transfering_save, name='transfering_save'),
    
    path("profit_in/",views.profit_in, name="profit_in"),
    path("asset_in/",views.asset_in, name="asset_in"),
    path("purcahsing_filter_inventories/", views.purcahsing_filter_inventories, name="purcahsing_filter_inventories"),
    path("purcahsing_save/", views.purcahsing_save, name="purcahsing_save"),

    path('get_filtered_profit/', views.get_filtered_profit, name='get_filtered_profit'),
    path('get_filtered_asset/', views.get_filtered_asset, name='get_filtered_asset'),
    path('get_accounts/', views.get_accounts, name='get_accounts'),

    path("filter_investers/", views.filter_investers, name="filter_investers"),

    path("selling/", views.selling_view, name="selling"),
    path("filter_inventories/", views.filter_inventories, name="filter_inventories"),
    path("selling_save/", views.selling_save, name="selling_save"),

    path('accounts-json/<str:user>/', views.get_json_account_data, name='accounts-json'),
    path('codes-json/<str:account>/', views.get_json_code_data, name='codes-json'),

    path("FIFA2022/", views.scores, name='scores'),
    path("whether/", views.whether, name='whether'),
    path("jusik/", views.Jusik, name='jusik'),
    path("cryptocurrency/", views.cryptocurrency, name='cryptocurrency'),
    path("property/", views.property, name='property'),


    path('auto/', views.autocomplete, name='autocomplete'),

    path('data/', views.data_view, name='data_view'),
    path('data/<int:pk>/', views.data_update_view, name='data_change'),
    path('get_field2/', views.get_field2, name='get_field2'),

]

 

 

그리고 forms.py가 있는데, 나는 이걸 잘 안쓴다. 일부가 사용되어 유용한 측면도 있는데, 아직 미숙하기도 하고, 서버와 클라이언트를 직접 연결하는 게 편해서 거의 쓰지 않고 있다.

from socket import fromshare
from django import forms
from datetime import date
from .models import Invester,Purchasing,Itemcode



class Date_Form(forms.Form):
    start = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}))
    end = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}))

class Purchase_Form(forms.ModelForm):
    class Meta:
        model = Purchasing
        fields = ['p_id', 'date','pname', 'accountnum', 'codename','amount', 'price',  'kind']

        widgets = {
            'date': forms.DateInput(attrs={'type': 'date'}),
        }
        initial = {
            'date': date.today(),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.fields['p_id'].label = '순번'
        self.fields['date'].label = '날짜'
        self.fields['pname'].label = '투자자'
        self.fields['accountnum'].label='증권계좌'
        self.fields['codename'].label = '종목'
        self.fields['amount'].label = '매입수량'
        self.fields['price'].label = '투자금액'
        self.fields['kind'].label = '투자구분'

        self.fields['codename'].queryset = Itemcode.objects.all()

        if 'user' in self.data:
            try:
                pname_id = int(self.data.get('user'))
                self.fields['accountnum'].queryset = Invester.objects.filter(user_id=pname_id).order_by('account')
            except (ValueError, TypeError):
                pass  # invalid input from the client; ignore and fallback to empty City queryset
        elif self.instance.pk:
            1
            #self.fields['accountnum'].queryset = self.instance.pname.accountnum_set.order_by('account')

class Purchase_Form2(forms.Form):
    field1 = forms.IntegerField(label="No")
    field2 = forms.ChoiceField(choices=[],label="투자자")
    field3 = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}), initial=date.today, label="날짜")
    field4 = forms.ChoiceField(choices=[],label="증권계좌")
    field5 = forms.ChoiceField(choices=[],label="종목")
    field6 = forms.CharField(label="투자금")
    field7 = forms.CharField(label="증권수")
    field8 = forms.ChoiceField(choices=[],label="투자구분")

class MyModelForm(forms.Form):
    field1 = forms.CharField(label='투자자', widget=forms.TextInput(attrs={'class': 'autocomplete'}))
    field2 = forms.CharField(label='증권계좌', widget=forms.TextInput(attrs={'class': 'autocomplete'}))

 

별개의 사용목적으로 모듈 형태의 파이썬 파일(getprice.py, apps.py 등)을 만들어 놓긴 했는데, 현재는 거의 쓰지 않고 있다.

 

기본적인 설명은 마쳤고, 다음 포스팅에서는 각각의 웹페이지를 만들면서 구체적으로 실질적인 웹 개발을 해 놓은 걸 포스팅 하도록 하겠다.

'Django' 카테고리의 다른 글

Django_자산관리 W_P_Project_02..[아파트 시세 조회]  (0) 2023.11.11

관련글 더보기