2015-02-14 18 views
10

Sto cercando di ottenere tutti i clienti da un'attività specifica, ma c'è un metodo di classe nel modello Cliente per ottenere alcune informazioni basate sulla stessa attività commerciale ... Lasciatemi spiegare questo con codice ...Passare gli argomenti per modellare i metodi nei modelli Django

class Business(models.Model): 
    ... 
    customers = models.ManyToManyField(Customer, blank=True, null=True) 

class Customer(models.Model): 
    ... 
    def get_something(self, obj_business) 
     ... 

Ok ora nel mio punto di vista ho tutti i clienti da un business specificato come questo:

obj_customers = obj_business.customers.all() 

Allora provo a stampare questo nel mio modello:

{% for obj_customer in obj_customers %} 
    {{ obj_customer.get_something ....... }} 

Ma sì, non c'è un modo per passare gli argomenti ... Mi piacerebbe sapere se c'è qualcosa che mi manca ...

mi chiedo se c'è un'altra soluzione creando invece un modello tag ... perché è un campo ManyToManyField, se il campo era stato solo ForeignKey, non è necessario passare un argomento a tale metodo ...

risposta

12

È possibile creare un semplice tag modello di chiamare qualsiasi metodo con argomenti:

from django import template 

register = template.Library() 

@register.simple_tag 
def call_method(obj, method_name, *args): 
    method = getattr(obj, method_name) 
    return method(*args) 

E poi nel modello:

{% call_method obj_customer 'get_something' obj_business %} 

Ma, ovviamente, il crating di un tag template specializzato è più :-) sicuro

@register.simple_tag 
def get_something(customer, business): 
    return customer.get_something(business) 

Template:

{% get_something obj_customer obj_business %} 
Problemi correlati