iT邦幫忙

2021 iThome 鐵人賽

DAY 14
1
自我挑戰組

Python 30天自我挑戰系列 第 14

Day14 - 使用表單新增資料

在完成前兩天的前置作業後,之後將繼續進行django的網站實作,接下來預計花大約2-3天的時間,完成將小說加入追蹤清單的功能。

因為時間關係,今天主要先完成程式雛形作為紀錄,細部功能先暫時留空待之後再補,且今天的程式尚未完成測試,故實際執行上可能會出問題。

今天預計進行的範圍如下:

  • 於forms.py新增 TrackBookForm類別,進行欄位檢核 (包含檢查網站是否在系統支援的範圍)
  • 於views.py新增 TrackBook方法,處理由前端發出的HTTP要求,經form檢核資料沒有問題後,將再進行模型的操作。

Form

  1. 於應用程式資料夾下新增forms.py檔案。

  2. 新增 TrackBookForm類別。

from django import forms
from django.core.exceptions import ValidationError

class TrackBookForm(forms.Form):
  oriurl = forms.URLField(required=True, help_text="輸入小說主頁的網址", label="網址" )

  def clean_oriurl(self):
    data = self.cleaned_data['oriurl']
    
    # 判斷data是否在支援的網站範圍內 (待補)
    support = True

    if support:
      raise ValidationError(_('網址不支援'))

    else:
      return data

  • forms.URLField():建立HTML可輸入的URL欄位。

    • required:是否必填
    • help_text:滑鼠游標停在欄位上時的提示
    • label:該欄位在前端畫面提供給使用者的名稱
  • clean_<fieldname>():在此方法下實作資料檢核。

View

  1. 開啟應用程式目錄下的views.py。

  2. 新增 TraceBook()方法,主要邏輯如下:

  • 如果HTTP要求為POST,表示為新增資料,需先檢查該作者是否已建檔,如未建檔需先於Author新增資料後,再新增Book。

  • 如果HTTP要求為GET(或其他),表示為表單尚未送出狀態(包含初次開啟頁面),故回傳初始表單。

from .models import Book, Author
from .forms import TrackBookForm

def TrackBook(request):

  # If this is a POST request then process the Form data
  if request.method == "POST":
    form = TrackBookForm(request.POST)
    
    if form.is_valid():
      # 取得相關資訊(待補)
      author_crawler = 'ooo'
      title_crawler = 'xxx'

      # 檢查作者是否存在,不存在則新增
      author_exist = Author.objects.filter(authorname__iexact=author_crawler)      

      if author_exist:
          authorid_crawler = author_exist.authorid
      else:
        record_author = Author(authorname=author_crawler)
        author_crawler = record_author.authorid
        record_author.save()

      # 檢查書是否已存在
      book_exist = Book.objects.filter(title__iexact=title_crawler)
      if book_exist:
          record_book = book_exist
          
      else:
          record_book = Book(title=title_crawler, authorid=author_crawler, oriurl=form.cleaned_data['oriurl'], isTrack=True)
          record_book.save()
      
      return render(request, 'track/track_book.html', {'form': TrackBookForm(), 'title_save': record_book.title})

  # If this is a GET (or any other method) create the default form.    
  else:
      form = TrackBookForm()

  return render(request, 'track/track_book.html', {'form': form, 'title_save': None})

上一篇
Day13 - 使用爬蟲套件擷取網頁內容
下一篇
Day15 - 建立模板
系列文
Python 30天自我挑戰30

尚未有邦友留言

立即登入留言