导读:很多朋友问到关于django如何处理动态表格的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!
django动态生成的表格,给每行添加按钮,提交数据的时候,怎么只提交本行的数据给url?
你还是没做过类似的东西吧。方法有很多种,最简单的是设置id,每一行的设置为str(index+1)类似,提交方法写在js,js查明该行的id就知道是那一行了,你弄个这么大范围的form岂不是把所有的input都提交了
Django 静态文件与动态文件
编辑 settings:
MEDIA_ROOT 和 MEDIA_URL 代表的是用户上传后的文件保存的地方。可以理解为存放可变文件的文件夹。
这两个参数有什么用处呢?
在 Django 的 FileField 和 ImageField 这样的 Model 类中,有 upload_to 参数可选。当 upload_to 设置相关的地址后,如例子:
文件上传后将自动保存到: os.path.join(MEDIA_ROOT, upload_to) ,在本例中就是: /static/uploads/test_pictures
而 MEDIA_URL ,则代表用户可以通过怎样的 URL 来访问这些上传后的文件资源。
在本例子中,本机地址是: , MEDIA_URL 设置为 /static/uploads/
那么通过: 文件名 就可以访问相关的上传图片或者其他文件。
STATIC_ROOT 和 STATIC_URL 则是网站中,用于网站放置的静态图片、CSS、JS 等文件的保存地址。可以理解为,保存网站运行中不会再变文件的文件夹(即不会删除或者新增)
STATIC_URL ,同 MEDIA_URL 类似;设置 STATIC_URL 为 "/static/" 时候,通过: 文件名 就可以访问相关的静态文件了。
STATIC_ROOT 是一个比较特殊的文件夹。这是 Django 的开发模式和部署模式区别最大的地方。
通常我们在开发模式下,可以在我们所在的 project 下建立相应的 app, 然后每个 app 下都建立相应的 static 文件夹。在开发模式下(Debug=True),Django 将为我们自动查找这些静态文件(每个app)并在网页上显示出来。然而,在部署模式下,Django 认为这些工作交由 web 服务器来运行会更有效率。
因此,在部署时,我们需要运行一下 :
这个命令将会把每个 app 里的 static 目录下的文件 copy 到 STATIC_ROOT 这个文件夹下。
如果在部署模式下,即: (Debug=False) 访问相关网页,如: 文件名 ,将不会访问 Django下各个 App 中的 static 文件夹,而是 STATIC_ROOT 中所指定的文件夹。
为了在部署模式下正确使用,我们还需要在 urls.py 中添加以下:
这相当于告诉 Django 碰到一个 "static" 开头的链接时,该如何处理。
了解完以上之后,我们让图片在前端显示出来。
编写一个 show 视图函数,来传递动态图片:
然后编写 show.html :
django中怎么动态操作数据库字段?
django的ORM系统不支持修改删除字段的操作,也就是说你在写模型model文件的时候,比如说定义了这个user表,然后包含字段telphone定义,你一旦执行了manage.py syncdb 这个操作,就把表结构往数据库写死了,如果你之是删除了model文件的telphone,数据库是不被重新修改的。这个时候必须用原生SQL解决,也就是说自己写SQL语句让django执行,这样的话会出很多问题,也就是说你执行了alter table users drop column telphone之后,你的model文件不知道你已经对users表结构做了修改,这样会出直接导致django应用的崩溃。所以动态字段不好做。也可能是我才疏学浅,没太理解,也许有高人能做到。不过面对ORM这样的尽量别删除字段。
django如何将excel表格导入oracel数据库?
1.选中excel文件中需要的部分,ctrl+c2.打开
illustrator
,新建文件(大一点),ctrl+v3.在illustrator里面,各部分是分开的,文字是文字,表格是表格。4.打开ps,直接将illustrator的内容拖拽到ps里,形成矢量智能图形(任意放大,不失真,貌似不能编辑)5.大功告成!本人试过觉得这个办法可行,所以亲自总结后与网友分享。
如何用Django和mysql自动分天建表
提供个思路。没试过,不知道是否可行。把表的抽象结构定义出一个Model,但记得加上
class Meta:
abstract=True
好了,你得到了一个模型的抽象类。抽象类在syncdb时候不会被建成表。
然后,写一个按照日期动态生成类的东东。比如你的抽象类叫MyModel的话。
def gen_model_by_date(dt=None):
if dt is None:
dt = datetime.datetime.today()
new_model_name = 'MyModel_{d}'.format(d=dt.strftime('%Y%m%d'))
new_model = type(new_model_name, (MyModel, ), {})
return new_model
然后这张表的所有逻辑里,都用这个方法来代替原model。
django代码相关应该也许这么就搞得定吧。 至于表……写SQL每天定时建表,建表以保证不会出现要用的表还没建好的情况就行了。
我是怎么做到使用django动态定义表单的
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:
1
2
3
4
5
6
7
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有多少个,是否修改成功.
=========================
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{% 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{% 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
1
2
3
4
5
6
7
8
{% block content %}
h2添加/修改设备向导/h2
p您已经成功添加了一个设备./p
{{form_data}}
{% endblock %}
============
还可以用另外的form来实现formwizard,就是第一个form1,主要用来让用户选择设备的分类,form2就根据前面的来动态生成参数的表单.原理是一样的.
还有就是写2个view来模拟formwizard,第一个view增加一个设备,第二个view带设备id这个参数即可,可以很有效的增加设备的参数.
结语:以上就是首席CTO笔记为大家整理的关于django如何处理动态表格的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,更多关于django如何处理动态表格的相关内容别忘了在本站进行查找喔。