django:通用视图-UpdateView更新有参数的form类

这个提示放在开始:要想使用通用视图更新form,那么这个form的类型必须是ModelForm,

即:

class FileForm(forms.ModelForm):
    ....

不要问我为什么知道的

------------------------------------------------------------------------------------------------------

首先:urls.py

#coding=utf-8
from django.conf.urls import patterns,url
from app_filemanager import views

urlpatterns=patterns('',
    ...
    url(r'^(?P<pk>\d+)/update/$', views.FileUpdateView.as_view(), name='update'),
    # 通用视图传值统一使用pk作为变量名,而这个pk往往都是model自己生成的那个编号,所以后面正则匹配用d+
)

然后:forms.py

#coding=utf8
from django import forms
from .models import File, Project, Tag
from django.contrib.auth.models import User, Group

class FileForm(forms.ModelForm):

    def __init__(self, user, *args, **kwargs):
        super(FileForm, self).__init__(*args, **kwargs)
        self.fields['tag'] = forms.ModelChoiceField(
            queryset = Tag.objects.filter(owner=user),
            required = True,
            label = "分类",
            help_text = "不能为空,个人文档分类使用",
            error_messages = {'required': "以下是必填项"},
            empty_label = "请至少选择一个",
            widget = forms.Select(
                attrs = {
                    'class': 'form-control',
                    'style': 'width:100%',
                }
            ),
        )
    project = forms.ModelChoiceField(
        queryset = Project.publicProjects.order_by('-add_date'),
        required = False,
        label = "所属项目",
        help_text = "可为空,为了防止混淆,一个文档只能属于一个项目",
        error_messages = {'required': "以下是必填项"},
        widget = forms.Select(
            attrs = {
                'class': 'form-control',
                'style': 'width:100%',
            }
        ),
    )
    tag = forms.ModelChoiceField(
        queryset = Tag.objects.none(),
    )

    group = forms.ModelMultipleChoiceField(
        queryset = Group.objects.order_by('-id'),
        required = True,
        label = "哪些组可见",
        help_text = "可以多选",
        error_messages = {'required': "以下至少选择一个"},
        widget = forms.SelectMultiple(
            attrs = {
                'class': 'form-control',
                'style': 'width:100%'
            }
        ),
    )

    desc = forms.CharField(
        required = False,
        label = "描述",
        widget = forms.Textarea(
            attrs = {
                'placeholder': u'可以通过描述查找文档',
                'rows': 2,
                'style': 'width:100%',
                'class': 'form-control',
            }
        ),
    )

    file = forms.FileField(
        required = True,
        label = "文档",
        help_text = "大小限制为1G",
        error_messages = {'required': "请选择一个文件"},
    )

    deleted = forms.BooleanField(
        required = False,
        label = "选中则标记为删除",
        help_text = "默认公开,个人文件不会被项目归类",
        widget = forms.HiddenInput(
            attrs = {
                'style': 'width:100%',
                'class': 'form-control',
            }
        ),
    )

    public = forms.BooleanField(
        required = False,
        label = "公开",
        #help_text = "选中为公开,个人文件不会被项目归类",
    )
    class Meta:
        model = File
        fields = ('project', 'tag', 'group', 'desc', 'file', 'public')

关于form类里的init方法,你可以参考我的上篇,这里

上篇博文是如何将request.user传到form里面,这里讲一下如何在update通用视图传user

再然后:views.py

class FileUpdateView(UpdateView):
    model = File
    template_name_suffix = '_update_form'
    success_url = '/file/'
    permission_required = 'app_filemanager.can_change_file'
    permission_fail_message = ('You don\'t have permission to change employee info.')
    form_class = FileForm
    def get_form_kwargs(self):
        kwargs = super(FileUpdateView, self).get_form_kwargs()
        kwargs.update({
            'user':self.request.user
        })
        return kwargs

最后:file_update_form.html

{% extends "base.html" %}
{% block content_middle %}
<form action="" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" class="btn btn-default" value="Update" />
</form>
{% endblock %}

附上效果图:

就是这么简单,所以说django的form类如果会用并且灵活应用的话是很省事的,有问题留言

时间: 2024-07-30 10:19:52

django:通用视图-UpdateView更新有参数的form类的相关文章

django通用视图

通用视图 1. 前言 回想一下,在Django中view层起到的作用是相当于controller的角色,在view中实施的 动作,一般是取得请求参数,再从model中得到数据,再通过数据创建模板,返回相应 响应对象.但在一些比较通用的功能中,比如显示对象列表,显示某对象信息,如果反复 写这么多流程的代码,也是一件浪费时间的事,在这里,Django同样给我们提供了类似的 "shortcut"捷径--通用视图. 2. 使用通用视图 使用通用视图的方法就是在urls.py这个路径配置文件中进

Django - 通用视图

urls.py from . import views ... url(r'^$', views.IndexView.as_view, name="index"), url(r'^(?P<pk>\d+)$', views.DetailView.as_view(), name="detail"), #DetailView一定要使用pk views.py from django.views import generic from .models import

基于类的通用视图

基于类的通用视图 前面我们说过了django的通用视图,不知道django通用视图的去看我前面的随笔,谢谢 django的通用视图帮我们省略了很多代码,但有时候django的通用视图并不能满足我们全部的需求,例如像重定义一些属性和方法的时候,或者我们想换种写法的时候,因此,django提供了基于类的通用视图,通过子类或者在url中传参的方法来配置我们的基于类的通用视图 通用视图和基于类的通用视图是两种不一样的写法,前面我们介绍的通用视图,所有的代码集中于url的配置文件中,而基于类的通用视图主要

Django 通用类视图

引文 所有的类视图都继承django.views.generic.base.View类. 在URLconf中简单的使用通用视图 如果只是简单的做一些属性修改,可以使用as_view()方法,如下所示: from django.urls import path from django.views.generic import TemplateView urlpatterns = [ path('about/', TemplateView.as_view(template_name="about.h

Django学习之通用视图(generic views)

Django的通用视图可以减少开发的单调性,它抽象出一些在视图开发中常用的代码和模式,这样就可以在无需编写大量代码的情况下,快速编写出常用的视图函数.下面将使用通用视图重写前面所写的代码.要使用通用视图,我们需要做几件事: 修改URLconf 编写基于通用视图的视图函数 1.修改URLconf from django.conf.urls import patterns,url from blog.views import * urlpatterns = patterns('', url(r'^$

python_django 返回和 通用视图

普通方式:HttpResponse polls/views.py from django.http import HttpResponsefrom django.template import RequestContext, loaderfrom .models import Questiondef index(request):     latest_question_list = Question.objects.order_by('-pub_date')[:5]     template 

通用视图

向用户展示hvvms.hvsrvs.hvvhds信息,除了model名称不同,view中的功能都相同,所以可以通过通用视图实现,减少代码重复 参考:http://djangobook.py3k.cn/2.0/chapter08/ 1.编辑urls.py from django.conf.urls import * from django.conf.urls import url from . import views,models urlpatterns = [ url(r'^$', views

Django基本视图

下面这三个类也许不能提供项目所需的所有的功能,这些应用于基于类的视图或Mixins情形下. 大多数Django的内建视图继承于其他基于类的视图或者各种mixins中,因为继承链是很重要的. View class django.views.generic.base.View 这是基于类视图的主控类,所有的其他的基于类的视图都这个基类.严格来说他不是一个通用视图,但也可被导入. Method Flowchart 方法流程图 1. dispatch() 2. http_method_not_allow

Django高级视图和URL配置

URLconf 技巧 URLconf没什么特别的,就象 Django中其它东西一样,它们只是 Python代码.你可以在几方面从中得到好处,正如下面所描述的. 流线型化(Streamlining)函数导入 看下这个 URLconf,它是建立在第三章的例子上: from django.conf.urls.defaults import * from mysite.views import current_datetime, hours_ahead, hours_behind, now_in_chi