Django:可以“双” 'render_to_response'统一为一个视图? [英] Django: can "double" 'render_to_response' be unified into only one view?

查看:170
本文介绍了Django:可以“双” 'render_to_response'统一为一个视图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在 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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆