I Django, hvordan kan jeg iterere over resultatet av en ny tilpasset mal kode som krever argumenter?

stemmer
4

Hvis jeg har laget en mal tag:

@register.simple_tag
def last_books(a_cat, cutoff=5):
    objects = Books.objects.filter(category=a_cat)
    return objects[:cutoff]

Hvordan kan jeg gjøre noe sånt som dette i mitt mal:

{% for book in last_books 'Sports' 3 %}

Jeg er for tiden får denne feilmeldingen:

'For' uttalelser bør bruke formatet for x in y ': for xi last_books 'Sport' 3

Publisert på 16/03/2009 klokken 15:46
kilden bruker
På andre språk...                            


2 svar

stemmer
2

Hvorfor ikke med ?

Svarte 16/03/2009 kl. 15:49
kilden bruker

stemmer
7

Personlig ville jeg bare pass i boken som en kontekst variabel via utsikten. På den måten har du ikke behov for en mal tag.

Alternativt kan du bruke inclusion_tag dekoratør i stedet, som brytes opp tanken på å gjengi en inkluderer mal med en tilpasset konteksten i det gjeldende dokumentet.

Men hvis du ønsker å fortsette på den aktuelle banen, simple_tager dekoratør ikke veien å gå. Det er til bruk når du trenger å returnere en stringder du vil gjengitt direkte inn i malen. Hva du prøver å gjøre er å sette en mal sammenheng variabel. Dette er litt mer involvert, men ikke for vanskelig. Lag en node noe sånt som dette:

class LastBooksNode(template.Node):
    def __init__(self, category, cutoff=5, var_name='books'):
        self.category = category
        self.cutoff = cutoff
        self.var_name = var_name
    def render(self, context):
        context[self.var_name] = Books.objects.filter(category=self.category)[:self.cutoff]
        return ''

@register.tag(name='last_books')
def do_last_books(parser, token):
    error = False
    try:
        tag_name, category, cutoff, _as, var_name = token.split_contents()
        if _as != 'as':
            error = True
    except:
        error = True

    if error:
        raise TemplateSyntaxError, 'last_books must be of the form, "last_books <category> <cutoff> as <var_name>"'
    else:
        return LastBooksNode(a_cat, cutoff, var_name)

Du vil deretter starte malen tag med:

{% import <your tag library> %}
{% last_books 'category' 5 as my_books %}
{% for book in my_books %}
    ....
{% endfor %}

Uprøvd, men jeg håper dette demonstrerer ideen. Som nevnt ovenfor, men passerer bøkene direkte til visning via kontekst eller ved hjelp av en inclusion_tag kan være lettere hvis du ikke har tenkt å bruke denne på flere steder.

Svarte 16/03/2009 kl. 17:21
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more