項目簡介
該項目是基于python的web類庫django開發的一套web網站,做為一個公益項目。
預覽位址
https://i.mypython.me/源碼位址
https://github.com/geeeeeeeek/mask啟動項目
django-admin startproject mask
建立應用
python3 manage.py startapp app
model設計
主要是對需求表Product進行設計,在此項目中,我們需要标題、聯系人、電話等字段。可參考models.py檔案。
設計字段如下:
class Product(models.Model):
list_display = ("title", "type", "location")
title = models.CharField(max_length=100,blank=True, null=True)
type = models.IntegerField(default=0)
pv = models.IntegerField(default=0)
contact = models.CharField(max_length=10,blank=True, null=True)
location = models.CharField(max_length=20,blank=True, null=True)
phone = models.CharField(max_length=13, blank=True, null=True)
weixin = models.CharField(max_length=50, blank=True, null=True)
status = models.BooleanField(default=False)
timestamp = models.DateTimeField(auto_now_add=True, null=True)
expire = models.IntegerField(default=1)
業務編寫
本項目一共分為3個頁面,分别是清單頁、詳情頁、送出頁。
我們一一講解
首頁
首先是首頁,它的模版位于templates/app/index.html 它主要是用來展示首頁内容, 并送出搜尋詞,到搜尋接口,所有的接口都位于app/urls.py裡面,如下
app_name = 'app'
urlpatterns = [
path('index', views.IndexView.as_view(), name='index'),
path('detail/<int:pk>', views.DetailView.as_view(), name='detail'),
path('commit', views.CommitView.as_view(), name='commit')
]
我們設定首頁的路由為IndexView, 開始編寫IndexView的代碼。它的代碼非常簡單:
class IndexView(generic.ListView):
model = Product
template_name = 'app/index.html'
context_object_name = 'product_list'
paginate_by = 15
c = None
def get_context_data(self, *, object_list=None, **kwargs):
context = super(IndexView, self).get_context_data(**kwargs)
paginator = context.get('paginator')
page = context.get('page_obj')
page_list = get_page_list(paginator, page)
context['c'] = self.c
context['page_list'] = page_list
return context
def get_queryset(self):
self.c = self.request.GET.get("c", None)
if self.c:
return Product.objects.filter(type=self.c).order_by('-timestamp')
else:
return Product.objects.filter(status=0).order_by('-timestamp')
詳情頁
我們再來開發詳情頁,從urls.py中看到,詳情頁是由DetailView來實作的,我們來窺探它的全貌:
class DetailView(generic.DetailView):
model = Product
template_name = 'app/detail.html'
def get_object(self, queryset=None):
obj = super().get_object()
return obj
def get_context_data(self, **kwargs):
context = super(DetailView, self).get_context_data(**kwargs)
return context
它很簡單,繼承了DetailView通用模闆類來顯示詳情。
送出頁
最後再來看一下送出頁,它是由CommitView來實作的。同樣是觀看代碼:
class CommitView(generic.CreateView):
model = Product
form_class = CommitForm
template_name = 'app/commit.html'
@ratelimit(key='ip', rate='2/m')
def post(self, request, *args, **kwargs):
was_limited = getattr(request, 'limited', False)
if was_limited:
messages.warning(self.request, "操作太頻繁了,請1分鐘後再試")
return render(request, 'app/commit.html', {'form': CommitForm()})
return super().post(request, *args, **kwargs)
def get_success_url(self):
messages.success(self.request, "釋出成功! ")
return reverse('app:commit')
它是繼承自CreateView,因為是建立操作嘛,在post中,我們通過ratelimit來限制送出次數,防止惡意送出。
運作項目
python3 manage.py runserver