基于python+django的二手商品交易平臺(tái)-二手商品供需系統(tǒng)
項(xiàng)目簡(jiǎn)介
該項(xiàng)目是基于python的web類庫(kù)django開發(fā)的一套web網(wǎng)站,二手商品交易平臺(tái),給師弟開發(fā)的課程作業(yè)。大家在學(xué)習(xí)過(guò)程中,遇到問題可以github咨詢作者。
預(yù)覽展示
http://mask.gitapp.cn
源碼地址
https://github.com/geeeeeeeek/mask
開發(fā)步驟:?jiǎn)?dòng)項(xiàng)目
django-admin startproject mask
開發(fā)步驟:創(chuàng)建應(yīng)用
python3 manage.py startapp app
開發(fā)步驟:model設(shè)計(jì)
主要是對(duì)需求表Product進(jìn)行設(shè)計(jì),在此項(xiàng)目中,我們需要標(biāo)題、聯(lián)系人、電話等字段??蓞⒖糾odels.py文件。
設(shè)計(jì)字段如下:
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)
開發(fā)步驟:業(yè)務(wù)編寫
本項(xiàng)目一共分為3個(gè)頁(yè)面,分別是列表頁(yè)、詳情頁(yè)、提交頁(yè)。
我們一一講解
首頁(yè)
首先是首頁(yè),它的模版位于templates/app/index.html 它主要是用來(lái)展示首頁(yè)內(nèi)容, 并提交搜索詞,到搜索接口,所有的接口都位于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')
]
我們?cè)O(shè)置首頁(yè)的路由為IndexView, 開始編寫IndexView的代碼。它的代碼非常簡(jiǎn)單:
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')
詳情頁(yè)
我們?cè)賮?lái)開發(fā)詳情頁(yè),從urls.py中看到,詳情頁(yè)是由DetailView來(lái)實(shí)現(xiàn)的,我們來(lái)窺探它的全貌:
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
它很簡(jiǎn)單,繼承了DetailView通用模板類來(lái)顯示詳情。
提交頁(yè)
最后再來(lái)看一下提交頁(yè),它是由CommitView來(lái)實(shí)現(xiàn)的。同樣是觀看代碼:
class CommitView(generic.CreateView):
? ?model = Product
? ?form_class = CommitForm
? ?template_name = 'app/commit.html'
? ?def post(self, request, *args, **kwargs):
? ? ? ?was_limited = getattr(request, 'limited', False) ? ? ? ?if was_limited:
? ? ? ? ? ?messages.warning(self.request, "操作太頻繁了,請(qǐng)1分鐘后再試") ? ? ? ? ? ?return render(request, 'app/commit.html', {'form': CommitForm()}) ? ? ? ?return super().post(request, *args, **kwargs) ? ?def get_success_url(self):
? ? ? ?messages.success(self.request, "發(fā)布成功! ") ? ? ? ?return reverse('app:commit')
它是繼承自CreateView,因?yàn)槭莿?chuàng)建操作嘛,在post中,我們通過(guò)ratelimit來(lái)限制提交次數(shù),防止惡意提交。
運(yùn)行項(xiàng)目
python3 manage.py runserver