2010-02-16 14 views
8

Estoy tratando de encontrar alguna documentación sobre cómo usar el ForeignKeyRawIdWidget en mis propios formularios. Actualmente sigo recibiendo el error, "init() toma al menos 2 argumentos que no son palabras clave (1 dado)" que no me dice nada.Django: utilizando ForeignKeyRawIdWidget fuera de los formularios de administración

Cualquier ayuda sería muy apreciada. Al buscar en Google esto aparece poco, pero las conversaciones dev y no hay ejemplos que pueda encontrar de cómo implementarlo.

Actualización: Esto está resuelto; ver solución a continuación.

+0

puedo mostrar cómo intenta inicializar el widget? –

+0

Si ha resuelto esto por su cuenta, publique su solución como respuesta y acéptelo. Incluir la solución en la pregunta es confuso. – Cerin

+0

¿Mejor? Gracias por el puntero. – tufelkinder

Respuesta

6

A partir del Django 1.5, esto funciona para reutilizar el ForeignKeyRawIdWidget en formularios no administrativos.

from django.contrib.admin.sites import site 

class InvoiceForm(ModelForm): 
    class Meta: 
     model = Invoice 
     widgets = { 
      'customer': ForeignKeyRawIdWidget(Invoice._meta.get_field('customer').rel, site), 
     } 

actualización

Django 2.0 se deprecating field.rel a favor de field.remote_field. Es posible que desee utilizar este lugar (también funciona en Django 1.11):

... 
ForeignKeyRawIdWidget(Invoice._meta.get_field('customer').remote_field, site), 
... 
+0

En Django 2.0 'rel' ha quedado en desuso (' RemovedInDjango20Warning: el uso de field.rel ha quedado en desuso. Use field.remote_field en su lugar'). Es posible que desee editar la respuesta para mantenerla actualizada. – jorgeh

0

Esto es desde el código fuente (django.contrib.admin.widgets):

class ForeignKeyRawIdWidget(forms.TextInput): 
    """ 
    A Widget for displaying ForeignKeys in the "raw_id" interface rather than 
    in a <select> box. 
    """ 
    def __init__(self, rel, attrs=None): 
     self.rel = rel 
     super(ForeignKeyRawIdWidget, self).__init__(attrs) 

    #..... 

Desde el código restante, me imagino que rel es el campo de clave externa de su modelo. En un punto, el código marca self.rel.limit_choices_to, y este atributo (limit_choices_to) solo se puede establecer en un campo ForgeinKey.

+1

Revisé este código también ... ¡No es exactamente el ejemplo o la documentación que esperaba! Y hace que sea muy difícil solucionar problemas cuando no obtienes nada en absoluto. – tufelkinder

Cuestiones relacionadas