Django:可以“双” 'render_to_response'统一为一个视图? [英] Django: can "double" 'render_to_response' be unified into only one view?
问题描述
我已经在 views.py 中定义了两个函数,以获得第一个具有某些元素菜单的prova.html ,然后在点击其中一个后,再次获取页面与 elementimenu 和元素相关联的 elementimenu 具有相同的id,即:
another_app.model.py
...
class ElementiTab(models.Model):
author = models.ForeignKey('auth.User',null = True,blank = False)
des = models.CharField(max_length = 30)
x = models.FloatField()
y = models.FloatField()
res = models.FloatField(default = 0)
created_date = models.DateTimeField(default = timezone.now)
...
这里我喜欢更好的代码:
views.py
from another_app.model import ElementiTab
def show_elementi (请求):
elementimenu = ElementiTab.obj ects.all()
return render_to_response('homepage / prova.html',{'elementimenu':elementimenu,'user.username':request},context_instance = RequestContext(request))
def show_detail(request,id):
elementimenu = ElementiTab.objects.all()
detail = get_object_or_404(ElementiTab,pk = id)
返回render_to_response('homepage / prova.html',{'elementimenu':elementimenu,'detail':detail,'user.username':request},context_instance = RequestContext(request))
urls.py
...
url(r'^ homepage / prova / $',views.show_elementi),
url(r'^ show_detail /(?P \d +)/ $,views.show_detail) ,
...
prova.html
...
< div class =elementi>
{element for elementimenu中的元素%}
< a href =/ show_detail / {{elementi.id}}> {{elementi.des}}< / a>
{%endfor%}
< / div>
< div class =表响应>
< table class =table table-bordered>
< tr class =info>
< td width =35%align =center> NOME< / TD>
< td width =35%align =center> DATA CREAZIONE< / td>
< td width =30%align =center> AUTORE< / td>
< / tr>
{%if detail%}
< div class =dettagli>
< tr>
< td> {{detail.des}}< / td>
< td> {{detail.created_date}}< / td>
< td> {{detail.author}}< / td>
< / tr>
{%endif%}
< / div>
< / table>
< / div>
...
我在 show_detail 视图,以便即使在调用此功能后,我也可以看到 elementimenu 。
是否有更优雅的方法?
id
(或 pk
添加默认的无
)参数: def show_elementi(request,pk = None):
elementimenu = ElementiTab.objects.all()
detail = get_object_or_404(ElementiTab,pk = pk)if pk else None
return render(request,'homepage / prova.html',
{'elementimenu':elementimenu,'detail'详细})
然后将两个网址映射到此视图:
url(r'^ homepage / prova / $',views.show_elementi),
url(r'^ show_detail /(?P< pk& \\ d +)/ $',views.show_elementi),
I have defined two functions in views.py to obtain first prova.html with certain elementimenu and then, after clicking over one of them, I obtain again the page with elementimenu and elementi associated to elementimenu with the same id i.e.:
another_app.model.py
...
class ElementiTab(models.Model):
author = models.ForeignKey('auth.User', null=True, blank=False)
des = models.CharField(max_length=30)
x = models.FloatField()
y = models.FloatField()
res = models.FloatField(default=0)
created_date = models.DateTimeField(default=timezone.now)
...
And here the code that I like to get better:
views.py
from another_app.model import ElementiTab
def show_elementi(request):
elementimenu = ElementiTab.objects.all()
return render_to_response('homepage/prova.html',{'elementimenu': elementimenu, 'user.username': request}, context_instance = RequestContext(request))
def show_detail(request,id):
elementimenu = ElementiTab.objects.all()
detail = get_object_or_404(ElementiTab, pk=id)
return render_to_response('homepage/prova.html',{'elementimenu': elementimenu, 'detail': detail, 'user.username': request}, context_instance = RequestContext(request))
urls.py
...
url(r'^homepage/prova/$', views.show_elementi),
url(r'^show_detail/(?P<id>\d+)/$', views.show_detail),
...
prova.html
...
<div class="elementi">
{% for elementi in elementimenu %}
<a href="/show_detail/{{elementi.id}}">{{elementi.des}}</a>
{% endfor %}
</div>
<div class="table-responsive">
<table class="table table-bordered">
<tr class="info">
<td width="35%" align="center"> NOME</td>
<td width="35%" align="center"> DATA CREAZIONE </td>
<td width="30%" align="center"> AUTORE </td>
</tr>
{% if detail %}
<div class="dettagli">
<tr>
<td>{{detail.des}}</td>
<td>{{detail.created_date}}</td>
<td>{{detail.author}}</td>
</tr>
{% endif %}
</div>
</table>
</div>
...
I had used this "trick" in show_detail view so that I can see elementimenu even after calling this function.
Is there a more elegant way to do this?
Yes, you can use the single view. Add the default None
value for the id
(or pk
) argument:
def show_elementi(request, pk=None):
elementimenu = ElementiTab.objects.all()
detail = get_object_or_404(ElementiTab, pk=pk) if pk else None
return render(request, 'homepage/prova.html',
{'elementimenu': elementimenu, 'detail': detail})
And then map both urls to this view:
url(r'^homepage/prova/$', views.show_elementi),
url(r'^show_detail/(?P<pk>\d+)/$', views.show_elementi),
这篇关于Django:可以“双” 'render_to_response'统一为一个视图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!