首页>>后端>>Python->什么是django表单(2023年最新解答)

什么是django表单(2023年最新解答)

时间:2023-12-25 本站 点击:0

导读:很多朋友问到关于什么是django表单的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

django 编辑表单,数据怎么回显呀

如果我没有理解错误,这个很基本啊。在python教程里就有。所以我想你应该是对django还不熟悉。看看它官网上的那个教程。英文的,仔细,耐心些边看边练,看完它。

简单说django通过设置model将数据库的数据可以方便的通过class.objects.all这样的方法拿到,也可以使用get和filter等。拿到数据后,它存在model里的类的对象里。然后你将这个变量传递到template里去。在template里再将变量显示在html里。

通过HttpResponse这样的对象再将html返回给浏览器。

还有一种略简洁的方法,但是原理一样。里面有一个form对象,可以简化模板的使用,让传递变量更简单,不过做起model来,就更复杂一些。

django表单返回字段值的自定义

我这没环境,我记得,form.xx可以取到当前form的值,你看点错了仍然保留在框里的实际原理是,把form.xx取到的form值再传回去,所以你取出来后,应该是个字典,把不需要的清空就好了,你试试,不行的话我回去写个代码给你

如何正确使用 Django Forms

1. Django Forms的强大之处

有些django项目并不直接呈现HTML, 二是以API框架的形式存在, 但你可能没有想到, 在这些API形式的django项目中也用到了django forms. django forms不仅仅是用来呈现HTML的, 他们最强的地方应该是他们的验证能力. 下面我们就介绍几种和Django forms结合使用的模式:

2. 模式一: ModelForm和默认验证

最简单的使用模式便是ModelForm和model中定义的默认验证方式的组合:

# myapp/views.py

from django.views.generic import CreateView, UpdateView

from braces.views import LoginRequiredMixin

from .models import Article

class ArticleCreateView(LoginRequiredMixin, CreateView):

model = Article

fields = ('title', 'slug', 'review_num')

class ArticleUpdateView(LoginRequiredMixin, UpdateView):

model = Article

fields = ('title', 'slug', 'review_num')

正如以上代码中看到的一样:

ArticleCreateView和ArticleUpdateView中设置model为Article

两个view都基于Article model自动生成了ModelForm

这些ModelForm的验证, 是基于Article model中定义的field转换而来的

3. 模式二, 在ModelForm中修改验证

在上面的例子中, 如果我们希望每篇article title的开头都是"new", 那么应该怎么做呢? 首先我们需要建立自定义的验证(validator):

# utils/validator.py

from django.core.exceptions import ValidationError

def validate_begins(value):

if not value.startswith(u'new'):

raise ValidationError(u'Must start with new')

可见, 在django中的验证程序就是不符合条件便抛出ValidationError的function, 为了方便重复使用, 我们将它们放在django app utils的validators.py中.

接下来, 我们可以在model中加入这些validator, 但为了今后的方便修改和维护, 我们更倾向于加入到ModelForm中:

# myapp/forms.py

from django import forms

from utils.validators import validate_begin

from .models import Article

class ArticleForm(forms.ModelForm):

dev __init__(self, *args, **kwargs):

super(ArticleForm, self).__init__(8args, **kwargs)

self.fields["title"].validators.append(validate_begin)

class Meta:

model = Article

Django的edit views(UpdateView和CreateView等)的默认行为是根据view中model属性, 自动创建ModelForm. 因此, 我们需要调用我们自己的Modelform来覆盖自动创建的:

# myapp/views.py

from django.views.generic import CreateView, UpdateView

from braces.views import LoginRequiredMixin

from .models import Article

from .forms import ArticleForm

class ArticleCreateView(LoginRequiredMixin, CreateView):

model = Article

fields = ('title', 'slug', 'review_num')

form_class = ArticleForm

class ArticleUpdateView(LoginRequiredMixin, UpdateView):

model = Article

fields = ('title', 'slug', 'review_num')

form_class = ArticleForm

4. 模式三, 使用form的clean()和clean_field()方法

如果我们希望验证form中的多个field, 或者验证涉及到已经存在之后的数据, 那么我们就需要用到form的clean()和clean_field()方法了. 以下代码检查密码长度是否大于7位, 并且password是否和password2相同:

# myapp/forms.py

from django import forms

class MyUserForm(forms.Form):

username = forms.CharField()

password = forms.CharField()

password2 = forms.CharField()

def clean_password(self):

password = self.cleaned_data['password']

if len(password) = 7:

raise forms.ValidationError("password insecure")

return password

def clean():

cleaned_data = super(MyUserForm, self).clean()

password = cleaned_data.get('password', '')

password2 = cleaned_data.get('password2', '')

if password != password2:

raise forms.ValidationError("passwords not match")

return cleaned_data

其中需要注意的是, clean()和clean_field()的最后必须返回验证完毕或修改后的值.

5. 模式四, 自定义ModelForm中的field

我们会经常遇到在form中需要修改默认的验证, 比如一个model中有许多非必填项, 但为了信息完整, 你希望这些field在填写时是必填的:

# myapp/models.py

from django.db import models

class MyUser(models.Model):

username = models.CharField(max_length=100)

password = models.CharField(max_length=100)

address = models.TextField(blank=True)

phone = models.CharField(max_length=100, blank=True)

为了达到以上要求, 你可能会通过直接增加field改写ModelForm:

# 请不要这么做

# myapp/forms.py

from django import forms

from .models import MyUser

class MyUserForm(forms.ModelForm):

# 请不要这么做

address = forms.CharField(required=True)

# 请不要这么做

phone = forms.CharField(required=True)

class Meta:

model = MyUser

请不要这么做, 因为这违反"不重复"的原则, 而且经过多次的拷贝粘贴, 代码会变得复杂难维护. 正确的方式应当是利用__init__():

# myapp/forms.py

from django import forms

from .models import MyUser

class MyUserForm(forms.ModelForm):

def __init__(self, *args, **kwarg):

super(MyUserForm, self).__init__(*args, **kwargs)

self.fields['address'].required = True

self.fields['phone'].required = True

class Meta:

model = MyUser

值得注意的是, Django forms也是Python类, 类可以继承和被继承, 也可以动态修改.

django什么意思

[编辑本段]概述

Django(发音:/ˈdʒæŋgoː/) 是用python语言写的开源web开发框架(open source web framework),它鼓励快速开发,并遵循MVC设计。Django遵守 BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 。

Django 根据比利时的爵士音乐家Django Reinhardt命名,他是一个吉普赛人,主要以演奏吉它为主,还演奏过小提琴等。

[编辑本段]设计哲学

Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(Do Not Repeat Yourself)原则。

Django基于MVC的设计十分优美:

对象关系映射 (ORM,object-relational mapping)

以Python类形式定义你的数据模型,ORM将模型与关系数据库连接起来,你将得到一个非常容易使用的数据库API,同时你也可以在Django中使用原始的SQL语句。

URL 分派

使用正则表达式匹配URL,你可以任意设计的URL,没有框架的特定限定。象你喜欢的一样灵活。

模版系统

使用Django强大而可扩展的模板语言,可以分隔设计、内容和Python代码。并且具有可继承性。

表单处理

你可以方便的生成各种表单模型,实现表单的有效性检验。可以方便的从你定义的模型实例生成相应的表单。

Cache系统

可以挂在内存缓冲或其它的框架实现超级缓冲 -- 实现你所需要的粒度。

会话(session),用户登录与权限检查

快速开发用户会话功能。

国际化

内置国际化系统,方便开发出多种语言的网站。

自动化的管理界面

不需要你花大量的工作来创建人员管理和更新内容。Django自带一个ADMIN site,类似于内容管理系统。

[编辑本段]部署

Django可以运行在Apache上,也可以运行在支持WSGI,FastCGI的服务器上。支持多种数据库,已经支持Postgresql, MySql, Sqlite3。

目前,Google App Engine也支持Django的某些部分。

[编辑本段]文档

Django1.0 建立了强大完整的文档文档体系 (),涵盖了Django的方方面面,并且适合各种水平的读者和开发者. 其中还包含若干个简单的示例,你可以跟随他们一步步体验Django的优美。

求助django 实现前端页面检索功能的代码

设我们的 django 博客应用有如下的文章模型:

blog/models.pyclass Post(models.Model):

# 标题

title = models.CharField(max_length=70)

# 正文

body = models.TextField()

# 其他属性

def __str__(self):

return self.title

先看到第 1 步,用户在搜索框输入搜索关键词,因此我们要在博客上为用户提供一个搜索表单,html 表单代码大概像这样:

form method="get" action="/search/"

{% csrf_token %} input type="search" placeholder="搜索" required

button type="submit"搜索/button/form

特别注意在 form 标签下有一个 {% csrf_token %},这是 django 用来防御跨站请求伪造(CSRF)攻击的机制。如果不知道什么是 CSRF 的话也没有关系,只要记住在使用 django 时,前端的表单代码里一定要加上 {% csrf_token %}。

用户输入了搜索关键词并点击了搜索按钮后,数据就被发送给了 django 后台服务器。表单的 action 属性的值为 /search/,表明用户提交的结果将被发送给 /search/ 这个 URL。我们为这个 URL 绑定一个 django 视图函数,在这个视图函数里完成前面第 2 步提到的过程。假设我们把视图函数的代码写在 blog/views.py 里:

blog/views.pydef search(request):

q = request.GET.get('q')

error_msg = ''

if not q:

error_msg = '请输入关键词'

return render(request, 'blog/errors.html', {'error_msg': error_msg})

post_list = Post.objects.filter(title__icontains=q)

return render(request, 'blog/results.html', {'error_msg': error_msg,

'post_list': post_list})

首先我们使用 request.GET.get('q') 获取到用户提交的搜索关键词。用户通过表单提交的数据 django 为我们保存在 request.GET 里,这是一个类似于 Python 字典的对象,所以我们使用 get 方法从字典里取出键 q 对应的值,即用户的搜索关键词。这里字典的键之所以叫 q 是因为我们的表单中搜索框 input 的 name 属性的值是 q,如果修改了 name 属性的值,那么这个键的名称也要相应修改。

接下来我们做了一个小小的校验,如果用户没有输入搜索关键词而提交了表单,我们就无需执行查询,而是渲染一个错误页面提示用户请输入关键词。

如果用户输入了搜索关键词,我们就通过 filter 方法从数据库里过滤出符合条件的所有文章。这里的过滤条件是 title__icontains=q,即 title 中包含(contains)关键字 q,前缀 i 表示不区分大小写。这里 icontains 是查询表达式(Field lookups),其用法是在模型需要筛选的属性后面跟上两个下划线。django 内置了很多查询表达式,建议过一遍 django 官方留个印象,了解每个表达式的作用,以后碰到相关的需求就可以快速定位到文档查询其用途:Field lookups

接下来就是渲染搜索结果页面,显示符合搜索条件的文章列表,下面是一个模板的简单示例:

results.html

{% if error_msg %} p{{ error_msg }}/p{% endif %}

{% for post in post_list %} div

在这里显示文章的相应信息 /div{% empty %} div class="no-post"

没有搜索到符合条件的文章 /div{% endfor %}

有了视图函数后记得把视图函数映射到相应了 URL,前面我们表单数据提交的 URL 为 /search/,因此将视图函数 search 绑定到该 URL 上。

blog/urls.pyurlpatterns = [

# 其他 url 配置

url(r'^search/$', views.search, name='search'),]

大功告成!

结语:以上就是首席CTO笔记为大家介绍的关于什么是django表单的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Python/60019.html