V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lovezww2011
V2EX  ›  程序员

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

  •  
  •   lovezww2011 ·
    geeeeeeeek · 2023-07-13 21:44:34 +08:00 · 1151 次点击
    这是一个创建于 527 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目简介

    该项目是基于 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
    
    5 条回复    2023-07-14 20:21:18 +08:00
    iluolSNS
        1
    iluolSNS  
       2023-07-13 22:11:21 +08:00
    感谢分享 最近正在学 python
    JavaGym
        2
    JavaGym  
       2023-07-13 22:53:39 +08:00 via iPhone
    @iluolSNS 你是在哪儿找的学习资源
    iluolSNS
        3
    iluolSNS  
       2023-07-13 23:05:00 +08:00
    @kaihu204 我本身做 java 的 随便找找 python 入门的 pdf 看看语法 然后找这种项目练手吧 系统的学习路线可以去 B 站或者知乎搜搜 会一门后端语言 在学习其他的语言其实挺快的 大致上都差不多
    iorilu
        4
    iorilu  
       2023-07-14 11:35:45 +08:00
    老兄一套系统发了 10 个贴了把
    lovezww2011
        5
    lovezww2011  
    OP
       2023-07-14 20:21:18 +08:00
    @iorilu 哈哈,被你发现了。其实还是略有不同的。加油
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2692 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:33 · PVG 16:33 · LAX 00:33 · JFK 03:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.