python django listview form 组合使用记录

DjangoListView与Form结合实现数据查询功能详解,
本文详细介绍了如何在Django中使用ListView和Form类配合,实现GET和POST请求下的表格查询功能,包括form_class的使用和queryset的过滤操作。

python django listview form 组合使用记录

一、 背景

在使用django的listview类快速建立表格,很方便。便没有理解如何同时使用FORM表单,实现查询功能。

二、官方文档

(一)views

from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.views import View

from .forms import MyForm

class MyFormView(View):
    form_class = MyForm
    initial = {'key': 'value'}
    template_name = 'form_template.html'

    def get(self, request, *args, **kwargs):
        form = self.form_class(initial=self.initial)
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            # <process form cleaned data>
            return HttpResponseRedirect('/success/')

        return render(request, self.template_name, {'form': form})

替代以前的

from django.http import HttpResponseRedirect
from django.shortcuts import render

from .forms import MyForm

def myview(request):
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            # <process form cleaned data>
            return HttpResponseRedirect('/success/')
    else:
        form = MyForm(initial={'key': 'value'})

    return render(request, 'form_template.html', {'form': form})

三、难点及解析

(一)要有get和post

不能只有一个,要两个函数都有。

(二)在get和post的函数中,要调用查询,才能出现结果。

(三)引用form时,要使用form_class

views文件

class Listview(ListView):
    template_name = 't/listview.html'
    form_class = forms.Tform
    initial = {
        'name':'b'
    }
    paginate_by = 20
    extra_context = {
        'title':'T0',
        'pagination_url':'t:listview',
        'nanme':'a',
                     }
    def get_queryset(self):
        return models.T.objects.all()
        
    def get(self,request, *args, **kwargs):
        form = self.form_class(initial=self.initial)
        object_list=self.get_queryset()
        return render(request,self.template_name,{'form':form,'object_list':object_list})
    
    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            n_str = form.cleaned_data['name']
            object_list = models.T.objects.filter(Q(T01__name__icontains=n_str)|Q(t0__name__icontains=n_str)|Q(name__icontains=n_str))
            return render(request, self.template_name, {'form': form,'object_list':object_list})
        return render(request, self.template_name, {'form': form})

html文件

    <form action="" method="post">
        {{form.as_p}}
        <input type="submit" value="查询">

    </form>

form文件

class Tform(forms.Form):
    name = forms.CharField(label='名称')
<think>我们正在处理一个用户请求,要求提供使用PythonDjango开发的会员管理系统的完整代码示例。根据系统指令,我们需要:1.在行内数学表达式中使用$...$格式(但当前问题不涉及数学表达式)。2.独立公式使用$$...$$格式(当前问题也不涉及)。3.LaTeX语法正确(但这里主要是代码,所以不需要LaTeX)。4.使用中文回答。5.生成相关问题(在最后)。6.回答中引用的段落末尾添加引用标识(但用户提供的引用[1][2][3]是关于员工管理、工资管理等,我们只能参考其结构,不能直接使用,因为没有会员管理系统的直接引用)。用户明确要求:会员管理系统的完整代码示例。注意:完整代码示例通常很长,不适合在一个回答中展示。因此,我们将提供一个简化但可运行的示例,包括必要的模型、视图、URL和模板。步骤:1.分析会员管理系统的基本功能:会员注册、登录、信息管理、权限控制等。2.参考引用中提供的结构(如管理员模型、工资管理系统等),构建会员相关的模型。3.创建视图函数或类视图来处理业务逻辑。4.设置URL路由。5.提供简单的模板示例。由于篇幅限制,我们只能提供核心代码片段,而不是整个项目。我们将构建一个简单的会员管理系统,包括:-会员模型(Member)-会员注册视图-会员登录视图-会员信息查看视图-会员信息修改视图另外,我们使用Django内置的认证系统来简化登录和权限管理。开始编写代码:</think> ### Python Django 会员管理系统完整代码示例 下面是一个精简但完整的会员管理系统示例,包含核心功能模块。此代码基于MVC架构,可直接用于搭建基础会员系统: #### 1. 模型层 (models.py) ```python from django.db import models from django.contrib.auth.models import AbstractUser class Member(AbstractUser): MEMBER_LEVEL_CHOICES = [ ('bronze', '青铜会员'), ('silver', '白银会员'), ('gold', '黄金会员'), ('platinum', '白金会员'), ] phone = models.CharField('手机号', max_length=15, unique=True) level = models.CharField('会员等级', max_length=20, choices=MEMBER_LEVEL_CHOICES, default='bronze') points = models.PositiveIntegerField('积分', default=0) registration_date = models.DateField('注册日期', auto_now_add=True) last_active = models.DateTimeField('最后活跃时间', auto_now=True) class Meta: verbose_name = '会员信息' verbose_name_plural = verbose_name class MembershipRecord(models.Model): member = models.ForeignKey(Member, on_delete=models.CASCADE) operation = models.CharField('操作类型', max_length=50) points_change = models.IntegerField('积分变化') timestamp = models.DateTimeField('操作时间', auto_now_add=True) class Meta: verbose_name = '会员操作记录' verbose_name_plural = verbose_name ``` #### 2. 视图层 (views.py) ```python from django.views.generic import ListView, CreateView, UpdateView from django.urls import reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .models import Member, MembershipRecord class MemberListView(LoginRequiredMixin, ListView): model = Member template_name = 'member_list.html' context_object_name = 'members' paginate_by = 10 def get_queryset(self): return Member.objects.order_by('-last_active') class MemberCreateView(CreateView): model = Member template_name = 'member_form.html' fields = ['username', 'password', 'phone', 'level'] success_url = reverse_lazy('member_list') def form_valid(self, form): # 密码加密处理 member = form.save(commit=False) member.set_password(form.cleaned_data['password']) member.save() return super().form_valid(form) class MemberUpdateView(LoginRequiredMixin, UpdateView): model = Member template_name = 'member_form.html' fields = ['phone', 'level', 'points'] success_url = reverse_lazy('member_list') def form_valid(self, form): # 记录积分变动 original_points = Member.objects.get(pk=self.object.pk).points if original_points != form.cleaned_data['points']: change = form.cleaned_data['points'] - original_points MembershipRecord.objects.create( member=self.object, operation='积分调整', points_change=change ) return super().form_valid(form) ``` #### 3. URL路由 (urls.py) ```python from django.urls import path from .views import MemberListView, MemberCreateView, MemberUpdateView urlpatterns = [ path('members/', MemberListView.as_view(), name='member_list'), path('members/create/', MemberCreateView.as_view(), name='member_create'), path('members/update/<int:pk>/', MemberUpdateView.as_view(), name='member_update'), ] ``` #### 4. 会员列表模板 (templates/member_list.html) ```html {% extends 'base.html' %} {% block content %} <h2>会员管理系统</h2> <a href="{% url 'member_create' %}" class="btn btn-primary">新增会员</a> <table class="table mt-3"> <thead> <tr> <th>用户名</th> <th>手机号</th> <th>会员等级</th> <th>积分</th> <th>操作</th> </tr> </thead> <tbody> {% for member in members %} <tr> <td>{{ member.username }}</td> <td>{{ member.phone }}</td> <td>{{ member.get_level_display }}</td> <td>{{ member.points }}</td> <td> <a href="{% url 'member_update' member.pk %}" class="btn btn-sm btn-info">编辑</a> </td> </tr> {% endfor %} </tbody> </table> {% endblock %} ``` #### 5. 运行配置 (settings.py 关键配置) ```python INSTALLED_APPS = [ # ... 'member_system.apps.MemberSystemConfig', 'crispy_forms', ] AUTH_USER_MODEL = 'member_system.Member' LOGIN_URL = '/accounts/login/' ``` ### 功能说明 1. **会员分级管理**:青铜/白银/黄金/白金四等级体系 2. **积分系统**:可增减积分并自动记录变动 3. **操作审计**:所有积分调整自动生成操作记录 4. **安全机制**: - 使用Django内置密码加密 - 登录保护敏感操作 - 用户手机号唯一约束 > 此示例为基础框架,实际部署需增加[^1]: > - 会员注册/登录界面 > - 权限控制系统 > - 会员数据分析模块 > - API接口支持 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值