2009-12-28 12 views
21

Es esto correcto?Django: limit_choices_to (¿Es esto correcto)

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'}) 

Estoy tratando de asegurarme de que un formulario de pedido solo mostrará las opciones del cliente que pertenecen a la misma cuenta que el pedido.

Si estoy con vistas a algunos evidente falacia mal diseño, que me haga saber.

Lo principal que me preocupa es:

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

No entendí su pregunta. ¿Podrías ser más claro? – Mayuresh

Respuesta

18

La única respuesta a '¿es correcto' es "funciona cuando se ejecuta? La respuesta a eso, por supuesto, es no, así que no sé por qué lo preguntas aquí.

No hay manera de utilizar limit_choices_to dinámicamente para limitar en función del valor de otro campo en el modelo actual. La mejor manera de hacerlo es mediante la personalización del formulario. Defina una subclase ModelForm y anule el método __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

El hecho de que no funcionó para mí no quería decir que tenía que ser el enfoque equivocado. Le pregunté porque no hay documentación clara acerca de esta característica en el sitio Django, y yo no estaba seguro de si mi sintaxis correcta. – orokusaki

+0

Esto también es bueno si necesita tener obj de solicitud en la clase MyOrderForm -> http://stackoverflow.com/a/6062628/758202 – zzart

+0

Sí, esto no está muy claro en los documentos. Supongo que el problema es que 'limit_choices_to' es un parámetro de la función ForeignKey, y esa función debe asignarse a un miembro de la clase. En este nivel, "yo" no significa nada. Para que funcione, 'Django' debe tener una función de filtro que funcione en' __init__', y, por lo que sé, no tiene una. –

-1

limit_choices_to={'account': 'self.account'} es incorrecto, ya que la clave externa al cliente no puede apuntar a Account.

+0

Aunque el cliente tiene el atributo "cuenta". Todavía este es el caso? – orokusaki

0

Debe establecer el campo choices de su formulario de pedido (heredado de ModelForm) en el constructor.

Cuestiones relacionadas