导读:今天首席CTO笔记来给各位分享关于Django什么时候用render的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
求助Django的render
求助Django的render
本程序与例8.9程序比,nzp函数的形参数组长度改为8,函数体中,for语句的循环条件也改为i8。因此,形参数组a和实参数组b的长度不一致。编译能够通过,但从结果看,数组a的元素a[5],a[6],a[7]显然是无意义的。
c. 在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。
例如,可以写为:
void nzp(int a[])
或写为
void nzp(int a[],int n)
其中形参数组a没有给出长度,而由n值动态地表示数组的长度。n的值由主调函数的实参进行传送。
由此,例8.10又可改为例8.11的形式。
【例8.11】
void nzp(int a[],int n)
{
int i;
printf(\"\\nvalues of array a are:\\n\");
for(i=0;in;i++)
{
if(a[i]0) a[i]=0;
printf(\"%d \",a[i]);
}
}
main()
{
int b[5],i;
printf(\"\\ninput 5 numbers:\\n\");
for(i=0;i5;i++)
scanf(\"%d\",b[i]);
printf(\"initial values of array b are:\\n\");
for(i=0;i5;i++)
printf(\"%d \",b[i]);
nzp(b,5);
printf(\"\\nlast values of array b are:\\n\");
for(i=0;i5;i++)
printf(\"%d \",b[i]);
}
请问用python+Django如何显示图片呢?如何显示一个纯静态的HTMl?急
要显示图片、CSS、JS之类的静态文件,需要在settings里配置静态文件目录,就是MEDIA_ROOT,MEIDA_URL,STATIC_ROOT和STATIC_URL,比如media/,static/。其实Django本身是不进行静态文件处理的,静态文件是交给Web服务器,如Apache来处理的。要显示一个纯HTML文件,可以将这么HTML文件拷贝到模版目录,在URL里指定路由,然后写一个视图函数,直接使用render_to_response这个快捷方式返回静态模版
def staticView(request):
return render_to_response(\'static.html\'),你可以参考我的个人介绍里,在SAE上用Django做的博客
2019-04-03 Django render 的用法
我们在Django 的文件的时候,会看到类似这样的函数,其实是把网页单独拿去设计的
这个时候只需要去研究后面所指的那个文件就可以了
然后我们就一并来看一下Django 的三神装
HttpResponse
render
redirect
主要参考这篇文章:
HttpResponse
返回一个参数给浏览器
render
讲过了
redirect
跳转到另外一个网页
django中render和redirect有什么区别
rails中的redirect 和 render区别 Rails里 1. render 和 redirect 只能用一个
如何在Django模板中注入全局变量
TeamCola中每个页面右上角都会出现的用户名但是如果用常规的方法,也就是在每个views方法中通过render_to_response方法注入用户数据的话,这样就会做非常多的重复工作,就像下面这样:def views_meth1(request): return render_to_response(\'template_1.html\', {\'user\': request.user}) def views_meth2(request): return render_to_response(\'template_2.html\', {\'user\': request.user}) def views_meth3(request): return render_to_response(\'template_3.html\', {\'user\': request.user}) # ...剩下的N个方法这在需要传入的变量比较简单、数量较少的时候还行,一旦需要注入的变量多一些,或是需要经过一些额外的计算才能生成的时候,那就麻烦大了。所以如何避免这种repeat yourself的2B模式呢?我们可以选择如下的一种模式: 在每次创建新的django项目的时候,一般来说我们都会在根目录中创建一个类似名为utils.py的工具module,在这个module中,我们可以通过定义一个自己的render方法,来为每次模板的渲染注入指定的全局变量:# in utils.py:def mp_render(request, template, context={}): context[\'user\'] = request.user return render_to_response(template, context) # in views.py:from utils import mp_render def views_meth1(request): return mp_render(request, \'template_1.html\') def views_meth2(request): return mp_render(request, \'template_2.html\') def views_meth3(request): return mp_render(request, \'template_3.html\')很好理解吧,这样以后有新增加的全局变量需要注入的话,只需要修改mp_render方法就行了。嗯,这是很普通的方法,既然是普通方法,那就再来个文艺点的吧。先来看看django文档里面对于render_to_response这个方法的定义吧,在’Required arguments’里面,有提到这个方法的第三个参数,叫context_instance,对于这个参数的说明如下:The context instance to render the template with. By default, the template will be rendered with a Context instance (filled with values from dictionary). If you need to use context processors, render the template with a RequestContext instance instead. Your code might look something like this:return render_to_response(\'my_template.html\', my_data_dictionary, context_instance=RequestContext(request))大意是:“默认的,render_to_response方法的第二个dictionary参数会被填充为一个Context对象注入进html模板文件里面。如果你需要使用context processors,那么需要使用一个RequestContext对象来渲染模板。”那么什么是context processors呢?看完这一段文档的定义以后,应该一切就很明了了。首先需要明白在django模板系统中,有两种封装模板变量的类,一个是django.template.Context,这是最常用的,我们在使用render_to_response方法的时候传入的第二个dictionary参数,就会被这个Context类封装一次,然后传到模板当中;另一个是django.template.RequestContext,它和Context类相比有两个不同之处。第一个不同的是,在生成一个RequestContext变量的时候,需要传入一个HttpRequest对象作为它的第一个参数: c = RequestContext(request, {\'foo\': \'bar\', })第二个区别是,它会增加一些自动注入模板的变量,这些变量从哪儿来呢?在django的settings.py里有一部分是配置TEMPLATE_CONTEXT_PROCESSORS的,这个配置中的那一个个的tuple元素其实是一个个可以被调用的方法,而这些方法都会接收一个HttpRequest对象作为参数,而最终return一个dictionary,这个dictionary里面的元素就会成为RequestContext中自动注入模板的变量。我们看看settings.py中TEMPLATE_CONTEXT_PROCESSORS的某一个元素 django.contrib.auth.context_processors.auth 对应的代码吧:# in django/contrib/auth/context_processors.pydef auth(request): \"\"\" ignore doc string \"\"\"def get_user(): .... return{\'user\': SimpleLazyObject(get_user), \'messages\': messages.get_messages(request), \'perms\': lazy(lambda: PermWrapper(get_user()), PermWrapper)(), }可以看到,auth方法最后返回的一个字典中,包含了三个元素,所以如果在使用render_to_response方法时,传入了第三个RequestContext参数,那么在它所渲染的模板中,就可以获取到对应的user、messages、perms变量了。所以最后文艺解决方法是,在每一个需要注入全局变量的views方法中,调用render_to_response的时候,都传入第三个RequestContext对象参数即可:def views_meth1(request): d1 = {\'method\': 1} return render_to_response(\'template_1.html\', d1, context_instance=RequestContext(request)) def views_meth2(request): d2 = {\'method\': 2} return render_to_response(\'template_2.html\', d2, context_instance=RequestContext(request)) def views_meth3(request): d3 = {\'method\': 3} return render_to_response(\'template_2.html\', d3, context_instance=RequestContext(request))这样需要注入的全局对象,就可以通过扩展TEMPLATE_CONTEXT_PROCESSORS来实现,灵活性更高,更易扩展。当然,在一般的项目开发中,个人觉得普通方法也足够用,所以就根据项目来做取舍吧。
我是怎么做到使用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什么时候用render的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。
以上内容为新媒号(sinv.com.cn)为大家提供!新媒号,坚持更新大家所需的互联网后端知识。希望您喜欢!
版权申明:新媒号所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请发送邮件至 k2#88.com(替换@) 举报,一经查实,本站将立刻删除。