🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
8 messages
8 total messages Started by ds Wed, 24 Nov 2010 22:17
Django i pole manytomany w template
#27809
Author: ds
Date: Wed, 24 Nov 2010 22:17
11 lines
1110 bytes
Czy jest jakaś możliwość żeby sprawdzić w szablonie czy dane pole onetomany 
lub manytomany zawiera określony element?

Załóżmy że mam obiekt "garaz" a wnim pole "model auta" (jeden do wielu) - 
głupi przykład ale obrazujący to co chcę osiągnąć. Chcę wylistować wszystkie 
garaże a przy tym który ma w sobie "fiata" napisać że jest. Do szablonu 
przekazuję garaże.

-- 
Pozdrawiam
ds
Re: Django i pole manytomany w template
#27811
Author: ds
Date: Wed, 24 Nov 2010 23:04
30 lines
1655 bytes
ds wrote:

> Czy jest jakaś możliwość żeby sprawdzić w szablonie czy dane pole
> onetomany lub manytomany zawiera określony element?
> 
> Załóżmy że mam obiekt "garaz" a wnim pole "model auta" (jeden do wielu) -
> głupi przykład ale obrazujący to co chcę osiągnąć. Chcę wylistować
> wszystkie garaże a przy tym który ma w sobie "fiata" napisać że jest. Do
> szablonu przekazuję garaże.
> 

Zrobiłem połowicznie i nieładnie jakoś mi się nie chce wierzyć że nie ma 
rozwiązania:

{% for auto in garaz.auta.all %}
	{% if auto.id == moje.id %}
		JEST
	{% endif %}
{% endfor %}

Tylko są dwa problemy:

1. nie podoba mi się takie pętlenie. Przy np. 1000 garaży gdzie każdy ma po 
kilkadziesiąt modeli tych pętli będzie bez liku

2. nie wiem jak to rozwiązać gdy będę chciał wyświetlać JEST/NIE MA

-- 
Pozdrawiam
ds
Re: Django i pole manytomany w template
#27814
Author: ds
Date: Thu, 25 Nov 2010 08:49
13 lines
1065 bytes
konryd wrote:
> 
http://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#in-
operator
>

Kurcze przeglądałem tą dokumentację, dlaczego tego nie widziałem?

Dzięki.

-- 
Pozdrawiam
ds
Re: Django i pole manytomany w template
#27813
Author: konryd
Date: Thu, 25 Nov 2010 09:30
37 lines
2475 bytes
On 25 Lis, 00:04, ds <ad...@email.pl> wrote:
> ds wrote:
> > Czy jest jakaś możliwość żeby sprawdzić w szablonie czy dane pole
> > onetomany lub manytomany zawiera określony element?
>
> > Załóżmy że mam obiekt "garaz" a wnim pole "model auta" (jeden do wielu) -
> > głupi przykład ale obrazujący to co chcę osiągnąć. Chcę wylistować
> > wszystkie garaże a przy tym który ma w sobie "fiata" napisać że jest. Do
> > szablonu przekazuję garaże.
>
> Zrobiłem połowicznie i nieładnie jakoś mi się nie chce wierzyć że nie ma
> rozwiązania:
>
> {% for auto in garaz.auta.all %}
>         {% if auto.id == moje.id %}
>                 JEST
>         {% endif %}
> {% endfor %}
>
> Tylko są dwa problemy:
>
> 1. nie podoba mi się takie pętlenie. Przy np. 1000 garaży gdzie każdy ma po
> kilkadziesiąt modeli tych pętli będzie bez liku
>
> 2. nie wiem jak to rozwiązać gdy będę chciał wyświetlać JEST/NIE MA
>
> --
> Pozdrawiam
> ds

http://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#in-operator

Możliwe że będzie stosować ten sam nieefektywny algorytm, ale nie
powinieneś się tym przejmować dopóki Cię nie walnie.

pozdrawiam,
Konrad
Re: Django i pole manytomany w template
#27815
Author: Łukasz Rekucki
Date: Thu, 25 Nov 2010 10:26
41 lines
2522 bytes
On Nov 25, 12:04 am, ds <ad...@email.pl> wrote:
> ds wrote:
> > Czy jest jakaś możliwość żeby sprawdzić w szablonie czy dane pole
> > onetomany lub manytomany zawiera określony element?
>
> > Załóżmy że mam obiekt "garaz" a wnim pole "model auta" (jeden do wielu) -
> > głupi przykład ale obrazujący to co chcę osiągnąć. Chcę wylistować
> > wszystkie garaże a przy tym który ma w sobie "fiata" napisać że jest. Do
> > szablonu przekazuję garaże.
>
> Zrobiłem połowicznie i nieładnie jakoś mi się nie chce wierzyć że nie ma
> rozwiązania:
>
> {% for auto in garaz.auta.all %}
>         {% if auto.id == moje.id %}
>                 JEST
>         {% endif %}
> {% endfor %}
>
> Tylko są dwa problemy:
>
> 1. nie podoba mi się takie pętlenie. Przy np. 1000 garaży gdzie każdy ma po
> kilkadziesiąt modeli tych pętli będzie bez liku
>
> 2. nie wiem jak to rozwiązać gdy będę chciał wyświetlać JEST/NIE MA

Ładnym rozwiązaniem, jest nie robienie tego w szablonie. Szablony
Django nie powinny zawierać logiki.

  # views.py

  render_to_response("cars.html", {"garages_with_modelX":
Garage.objects.filter(model_auta=fiat.pk)


  # cars.html

  Model fiat znajduje się w:

  {% for garage in garages_with_modelX %} {{ garage.address }} {%
endfor %}
Re: Django i pole manytomany w template
#27816
Author: konryd
Date: Fri, 26 Nov 2010 09:25
57 lines
3077 bytes
On 25 Lis, 11:26, Łukasz Rekucki <lreku...@gmail.com> wrote:
> On Nov 25, 12:04 am, ds <ad...@email.pl> wrote:
>
>
>
>
>
>
>
>
>
> > ds wrote:
> > > Czy jest jakaś możliwość żeby sprawdzić w szablonie czy dane pole
> > > onetomany lub manytomany zawiera określony element?
>
> > > Załóżmy że mam obiekt "garaz" a wnim pole "model auta" (jeden do wielu) -
> > > głupi przykład ale obrazujący to co chcę osiągnąć. Chcę wylistować
> > > wszystkie garaże a przy tym który ma w sobie "fiata" napisać że jest. Do
> > > szablonu przekazuję garaże.
>
> > Zrobiłem połowicznie i nieładnie jakoś mi się nie chce wierzyć że nie ma
> > rozwiązania:
>
> > {% for auto in garaz.auta.all %}
> >         {% if auto.id == moje.id %}
> >                 JEST
> >         {% endif %}
> > {% endfor %}
>
> > Tylko są dwa problemy:
>
> > 1. nie podoba mi się takie pętlenie. Przy np. 1000 garaży gdzie każdy ma po
> > kilkadziesiąt modeli tych pętli będzie bez liku
>
> > 2. nie wiem jak to rozwiązać gdy będę chciał wyświetlać JEST/NIE MA
>
> Ładnym rozwiązaniem, jest nie robienie tego w szablonie. Szablony
> Django nie powinny zawierać logiki.
>
>   # views.py
>
>   render_to_response("cars.html", {"garages_with_modelX":
> Garage.objects.filter(model_auta=fiat.pk)
>
>   # cars.html
>
>   Model fiat znajduje się w:
>
>   {% for garage in garages_with_modelX %} {{ garage.address }} {%
> endfor %}

Zwróć uwagę że to jest inny use case. OP nie chce wyświetlić tylko te
z autem, ale wszystkie a przy tych z autem zaznaczyć że jest (popatrz
na pierwszego maila).

pozdrawiam,
Konrad
Re: Django i pole manytomany w template
#27817
Author: Łukasz Rekucki
Date: Fri, 26 Nov 2010 11:02
66 lines
3572 bytes
On Nov 26, 10:25 am, konryd <kon...@gmail.com> wrote:
> On 25 Lis, 11:26, Łukasz Rekucki <lreku...@gmail.com> wrote:
>
>
>
>
>
>
>
>
>
> > On Nov 25, 12:04 am, ds <ad...@email.pl> wrote:
>
> > > ds wrote:
> > > > Czy jest jakaś możliwość żeby sprawdzić w szablonie czy dane pole
> > > > onetomany lub manytomany zawiera określony element?
>
> > > > Załóżmy że mam obiekt "garaz" a wnim pole "model auta" (jeden do wielu) -
> > > > głupi przykład ale obrazujący to co chcę osiągnąć. Chcę wylistować
> > > > wszystkie garaże a przy tym który ma w sobie "fiata" napisać że jest. Do
> > > > szablonu przekazuję garaże.
>
> > > Zrobiłem połowicznie i nieładnie jakoś mi się nie chce wierzyć że nie ma
> > > rozwiązania:
>
> > > {% for auto in garaz.auta.all %}
> > >         {% if auto.id == moje.id %}
> > >                 JEST
> > >         {% endif %}
> > > {% endfor %}
>
> > > Tylko są dwa problemy:
>
> > > 1. nie podoba mi się takie pętlenie. Przy np. 1000 garaży gdzie każdy ma po
> > > kilkadziesiąt modeli tych pętli będzie bez liku
>
> > > 2. nie wiem jak to rozwiązać gdy będę chciał wyświetlać JEST/NIE MA
>
> > Ładnym rozwiązaniem, jest nie robienie tego w szablonie. Szablony
> > Django nie powinny zawierać logiki.
>
> >   # views.py
>
> >   render_to_response("cars.html", {"garages_with_modelX":
> > Garage.objects.filter(model_auta=fiat.pk)
>
> >   # cars.html
>
> >   Model fiat znajduje się w:
>
> >   {% for garage in garages_with_modelX %} {{ garage.address }} {%
> > endfor %}
>
> Zwróć uwagę że to jest inny use case. OP nie chce wyświetlić tylko te
> z autem, ale wszystkie a przy tych z autem zaznaczyć że jest (popatrz
> na pierwszego maila).

Dlatego nie odpowiadałem na pierwszego maila, tylko na podany kod.
Zresztą nie widzę co zmienia to w fakcie, że nie powinno się
takich rzeczy robić w szablonie. Z przynajmniej kilku sposobów,
najmniej skomplikowany, który nie robi tysiąca bezsensownych zapytań:

    cars_with_fiat = set(fiat.garage_set.values_list('pk', flat=True))
    garages = Garage.objects.all()
    for g in garages:
        g.has_fiat = (g.pk in cars_with_fiat)
Re: Django i pole manytomany w template
#27818
Author: ds
Date: Fri, 26 Nov 2010 16:36
21 lines
1473 bytes
Łukasz Rekucki wrote:

>     cars_with_fiat = set(fiat.garage_set.values_list('pk', flat=True))
>     garages = Garage.objects.all()
>     for g in garages:
>         g.has_fiat = (g.pk in cars_with_fiat)

Rozważałem taką opcję, jednak "naturalnym" jest wykorzystanie w pełni ORM-a 
zawartego w django. Dlatego bardzo podoba mi się rozwiązanie:

{% for garaz in garaze %}
	{% if mojeauto in garaz.auta %}
		JEST
	{% else %}
		NIE MA
	{% endif %}
{% endfor %}

-- 
Pozdrawiam
ds
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads