基于 Python +django 的二手商品交易平台-二手商品供需系统(求 star)

356 天前
 lovezww2011

项目简介

该项目是基于 python 的 web 类库 django 开发的一套 web 网站,二手商品交易平台,给师弟开发的课程作业。大家在学习过程中,遇到问题可以 github 咨询作者。

预览展示

http://mask.gitapp.cn

源码地址

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
1040 次点击
所在节点    程序员
5 条回复
iluolSNS
356 天前
感谢分享 最近正在学 python
JavaGym
356 天前
@iluolSNS 你是在哪儿找的学习资源
iluolSNS
356 天前
@kaihu204 我本身做 java 的 随便找找 python 入门的 pdf 看看语法 然后找这种项目练手吧 系统的学习路线可以去 B 站或者知乎搜搜 会一门后端语言 在学习其他的语言其实挺快的 大致上都差不多
iorilu
356 天前
老兄一套系统发了 10 个贴了把
lovezww2011
355 天前
@iorilu 哈哈,被你发现了。其实还是略有不同的。加油

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/956586

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX