2009-12-28 14 views
21

È corretto?Django: limit_choices_to (è corretto)

class Customer(models.Model): 
    account = models.ForeignKey(Account) 


class Order(models.Model): 
    account = models.ForeignKey(Account) 
    customer = models.ForeignKey(Customer, limit_choices_to={'account': 'self.account'}) 

che sto cercando di fare in modo che un modulo d'ordine mostrerà solo le scelte dei clienti che appartengono allo stesso account come l'Ordine.

Se sto trascurando alcune vistose idee sbagliate, fatemelo sapere.

La cosa principale che mi riguarda con è:

limit_choices_to={'account': 'self.account'} 
+0

Non ho capito la tua domanda. Potresti essere più chiaro? – Mayuresh

risposta

18

L'unica risposta a "è corretto" è "funziona quando lo si esegue?" Ovviamente la risposta è no, quindi non so perché mi stai chiedendo qui.

Non c'è modo di usare limit_choices_to dinamicamente per limitare in base al valore di un altro campo nel modello corrente. Il modo migliore per farlo è personalizzando il modulo. Definire una sottoclasse ModelForm e sovrascrivere il metodo __init__:

class MyOrderForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyOrderForm, self).__init__(*args, **kwargs) 
     if 'initial' in kwargs: 
      self.fields['customer'].queryset = Customer.objects.filter(account=initial.account) 
+39

Solo perché non ha funzionato per me non significava che doveva essere l'approccio sbagliato. Ho chiesto perché non c'è una documentazione chiara su questa funzione sul sito Django, e non ero sicuro se la mia sintassi fosse corretta. – orokusaki

+0

Questo è anche un bene se è necessario avere richiesta obj in classe MyOrderForm -> http://stackoverflow.com/a/6062628/758202 – zzart

+0

Sì, questo non è molto chiaro nei documenti. Suppongo che il problema è che 'limit_choices_to' è un parametro della funzione ForeignKey e che questa funzione deve essere assegnata a un membro della classe. A questo livello, "io" non significa nulla. Per farlo funzionare, 'Django' dovrebbe avere una funzione di filtro che funzioni in' __init__', e, per quello che so, non ne ha uno. –

-1

limit_choices_to={'account': 'self.account'} è sbagliato, in quanto chiave esterna al cliente non può puntare a Account.

+0

Il cliente ha un attributo "account". Ancora questo è il caso? – orokusaki

0

È necessario impostare il campo choices del modulo d'ordine (ereditato da ModelForm) nel costruttore.

Problemi correlati