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})

<<:  【Day10】表单 Form:受控元件 Controlled Component

>>:  成员 14 人:如何养好一池鲨鱼水族箱

Day09 Kibana - Query DSL 复合查询

这一个章节节我们要来介绍复合查询,当单一的查询子句无法完成需求时,为了应付这种高级查询需求,所以就产...

Day 13: Monitor and Log with Google Cloud Operations Suite: Challenge Lab

Tasks: Initialize Cloud Monitoring. Navigation men...

IT铁人DAY 28-Observer 观察者模式

  今天要学习的是观察者模式,它主要的作用是设定一个订阅机制,当被订阅的物件有发生事件时就会去通知所...

[Day 18] 制作更多的Debug工具 (1) - 连接期错误

今日目标 合并iron_window与iron_render 制作DrawLine用来画辅助线 为什...

【D25】进入下个阶段(功能化)行前说明

前言 讯号灯做了差不多,剩下就是整合性作业,这边会说明之後的作法与规划。 整合 之前都是把各个讯号灯...