导读:今天首席CTO笔记来给各位分享关于如何复制django的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
我是怎么做到使用django动态定义表单的
django中表单向导使用起来很简单的.
[python] view plain copy
from django.utils.translation import ugettext_lazy as _
from django import forms
from django.forms.formsets import BaseFormSet
from django.forms.fields import FileField
from django.forms.util import ValidationError
from django.shortcuts import render_to_response
from django.contrib.formtools.wizard import FormWizard
from ddtcms.office.equipment.models import Equipment,Characteristic,CharacteristicValue
class EquipmentForm(forms.ModelForm):
class Meta:
model = Equipment
class CharacteristicValueForm(forms.Form):
def clean(self):
a=self.fields
s=self.data
self.cleaned_data = {}
# 下面的这一段for 是从 django的forms.py中的 full_clean 中复制来的
for name, field in self.fields.items():
# value_from_datadict() gets the data from the data dictionaries.
# Each widget type knows how to retrieve its own data, because some
# widgets split data over several HTML fields.
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
try:
if isinstance(field, FileField):
initial = self.initial.get(name, field.initial)
value = field.clean(value, initial)
else:
value = field.clean(value)
self.cleaned_data[name] = value
if hasattr(self, 'clean_%s' % name):
value = getattr(self, 'clean_%s' % name)()
self.cleaned_data[name] = value
except ValidationError, e:
self._errors[name] = self.error_class(e.messages)
if name in self.cleaned_data:
del self.cleaned_data[name]
#cl=self.cleaned_data
#debug()调试用的,查看cl的值,主要是看self.cleaned_data的值,如果return了,就看不到了
return self.cleaned_data
class EquipmentCreateWizard(FormWizard):
def done(self, request, form_list):
return render_to_response('equipment/done.html',
{
'form_data': [form.cleaned_data for form in form_list],
})
def get_form(self, step, data=None):
"Helper method that returns the Form instance for the given step."
form = self.form_list[step](data, prefix=self.prefix_for_step(step), initial=self.initial.get(step, None))
if step == 1:
if data:
cg = data.get('0-category', 1)
cs = Characteristic.objects.all().filter(category__id=cg)
for c in cs:
form.fields['Characteristic-'+str(c.id)] = forms.CharField(label = c.name)
g=form.fields
#debug()
return form
# 从wizard.py中复制过来进行更改的.
def render(self, form, request, step, context=None):
"Renders the given Form object, returning an HttpResponse."
old_data = request.POST
prev_fields = []
if old_data:
hidden = forms.HiddenInput()
# Collect all data from previous steps and render it as HTML hidden fields.
for i in range(step):
old_form = self.get_form(i, old_data)
hash_name = 'hash_%s' % i
prev_fields.extend([bf.as_hidden() for bf in old_form])
prev_fields.append(hidden.render(hash_name, old_data.get(hash_name, self.security_hash(request, old_form))))
if step == 1:
cg = old_data.get('0-category', 1)
cs = Characteristic.objects.all().filter(category__id=cg)
for c in cs:
form.fields['Characteristic-'+str(c.id)] = forms.CharField(label = c.name)
g=form.fields
#debug()
if step == 2:
debug()
return super(EquipmentCreateWizard, self).render(form, request, step, context=None)
def get_template(self, step):
return 'equipment/wizard_%s.html' % step
EquipmentCreateWizard其实也可以放在views.py中,而且我觉得更合理一点.
在EquipmentCreateWizard 中,我试着修改过process_step 函数,但是得不到正确的结果,后来修改了get_form,都是想从django的formtools的wizard.py中复制过来再进行修改的.
get_form的修改也没有得到正确的结果.后来就修改render函数,在第2步的时候,我将动态参数个数显示出来了.但是到最后结束done的环节,取得的formdata中,第二个form没有数据,就是一个空的{},
于是我又重新修改get_form函数,无非就是判断是不是第二步,然后给第二个form动态添加几个field:
[python] view plain copy
if step == 1:
cg = old_data.get('0-category', 1)
cs = Characteristic.objects.all().filter(category__id=cg)
for c in cs:
form.fields['Characteristic-'+str(c.id)] = forms.CharField(label = c.name)
g=form.fields
#debug()
这段代码在get_form和 render中都有,都是判断是不是第2步,然后就根据第1步中选择的设备的分类来查询到具体的分类,再根据分类来获取该种分类的设备有哪些参数,然后根据参数个数修改form的参数field的个数.
'Characteristic-'+str(c.id)是用来以后保存数据的时候,split这个字符串,得到参数的id,并在参数值表中保存Characteristic-1,Characteristic-2...的value.
g=form.fields
#debug()
用来断点查看参数field有多少个,是否修改成功.
=========================
[python] view plain copy
from django.conf.urls.defaults import *
from ddtcms.office.equipment.forms import EquipmentForm,CharacteristicValueForm,EquipmentCreateWizard
urlpatterns = patterns('ddtcms.office.equipment.views',
url(r'^$', 'index', name="equipment_index"),
url(r'^add/$', 'equipment_create', name="equipment_create"),
url(r'^add-by-wizard/$',EquipmentCreateWizard([EquipmentForm, CharacteristicValueForm]), name="equipment_create_by_wizard"), )
以上代码,csdnbolg 自动过滤了 $符号,我加了上去,可能有不对的地方.
==========================
wizard_0.html
[html] view plain copy
{% block content %}
h2添加/修改设备向导/h2
p第 {{ step }} 步, 共 {{ step_count }} 步./p
p填写设备基本情况/p
form method="POST" action=""{% csrf_token %}
table
{{ form }}
/table
input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /
{{ previous_fields|safe }}
input type="submit" value="Submit" /
/form
{% endblock %}
===================
wizard_1.html
[html] view plain copy
{% block content %}
h2添加/修改设备向导/h2
p第 {{ step }} 步, 共 {{ step_count }} 步./p
p填写设备参数, 如果没有要填写的内容, 请直接点击确定./p
form method="POST" action=""{% csrf_token %}
table
{{ form }}
/table
input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /
{{ previous_fields|safe }}
input type="submit" value="Submit" /
/form
{% endblock %}
====================
done.html
[html] view plain copy
{% block content %}
h2添加/修改设备向导/h2
p您已经成功添加了一个设备./p
{{form_data}}
{% endblock %}
============
还可以用另外的form来实现formwizard,就是第一个form1,主要用来让用户选择设备的分类,form2就根据前面的来动态生成参数的表单.原理是一样的.
还有就是写2个view来模拟formwizard,第一个view增加一个设备,第二个view带设备id这个参数即可,可以很有效的增加设备的参数.
如何在社区版pycharm中安装django
django是Python的一个开源web框架,在pycharm开发环境中,pycharm专业版在新建一个项目的时候有django选项,帮助创建一个django框架的项目。pycharm社区版需要自己创建
第一步:安装django框架
可以用pycharm安装,打开file \ setings \ project \ project interpreter 查看项目已安装的包,单击绿色加号添加目标框架,
注意记录django的安装路径,我的安装路径是: c:\users\用户名\appdata\roaming\python\python36\site-packages\
第二步:为了能让Windows找到django-admin的路径,需要设置环境变量,
path,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找,
打开我的电脑 \ 属性\ 高级系统设置 \ 环境变量 \ 找到path变量,把刚才记录的django的安装路径添加到path变量中。其中path变量中有的已经存有Python的目录,当path需要多个值的时候,两个路径之间用分号 “;”隔开
第三步:打开Windows命令行,用django-admin.py 创建项目,注意创建项目的路径 c:\users\fyc
打开目录位置,找到创建的项目,看到里面有一些文件
第四步:用pycharm打开上一步所创建的项目,由于pycharm默认的项目目录是 pycharmprojects,所以把刚才创建的项目拷贝到默认目录(也可以不拷贝,只是为了方便管理)
拷贝完项目之后打开pycharm ,文件,新建工程,选择文件位置,把文件目录选在在pycharmproject 下,刚才创建的目录下
打开项目,会出现提示
我们是想从一个已存在的资源创建项目,所以选是,完成创建
如何在django中使用多个数据库
Django可以自定义数据库读写路由,从实用的角度讲,一般就是主从复制的读写分离。这个比较简单,定义一个数据库路由即可,数据库路由的接口定义可以在Django官方文档,多数据库那一章找到。
cmd中如何在e盘新建django文件
1、在任意盘创建一个文件夹,然后在新建文件选择Django。
2、在url视图中创建路径。
3、在views视图中创建视图,让他呈现出来,并连接我们展示的HTML页面。
如何仿照django admin风格渲染自己写的网站
查看admin页面源码,找标签的id和class,然后去link的.css文件里面找样式.
接着复制这个css文件到自己项目里面,将id和class换掉即可.
结语:以上就是首席CTO笔记为大家整理的关于如何复制django的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,更多关于如何复制django的相关内容别忘了在本站进行查找喔。