2010-02-16 4 views
8

J'essaie de trouver de la documentation sur l'utilisation de ForeignKeyRawIdWidget dans mes propres formulaires. Actuellement, je continue d'obtenir l'erreur, "init() prend au moins 2 arguments non-mot-clé (1 donné)" qui ne me dit rien.Django: utilisation de ForeignKeyRawIdWidget en dehors des formulaires d'administration

Toute aide serait grandement appréciée. Googling cela se traduit par des conversations peu mais dev et pas d'exemples que je peux trouver sur la façon de l'implémenter.

Mise à jour: Ceci est résolu; voir la solution ci-dessous.

+0

Pouvez-vous montrer comment vous essayez d'initialiser le widget? –

+0

Si vous avez résolu ce problème par vous-même, postez votre solution en réponse et acceptez-la. Inclure la solution dans la question prête à confusion. – Cerin

+0

Mieux? Merci pour le pointeur. – tufelkinder

Répondre

6

À partir de Django 1.5, cela fonctionne pour réutiliser le ForeignKeyRawIdWidget dans les formulaires non-admin.

from django.contrib.admin.sites import site 

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

Mise à jour

Django 2.0 est dévalorisant field.rel en faveur de field.remote_field. Vous pourriez vouloir utiliser ceci à la place (fonctionne également sur Django 1.11):

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

Dans Django 2.0 'rel' a été déprécié (' RemovedInDjango20Warning: l'utilisation de field.rel a été abandonnée.Utilisez field.remote_field à la place.'). Vous pourriez vouloir modifier la réponse pour la tenir à jour. – jorgeh

0

C'est à partir du code source (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) 

    #..... 

À partir du code restant, je suppose que rel est le champ de clé étrangère de votre modèle. À un moment donné, le code vérifie self.rel.limit_choices_to et cet attribut (limit_choices_to) ne peut être défini que sur un champ ForgeinKey.

+1

J'ai revu ce code aussi ... Pas exactement l'exemple ou la documentation que j'espérais! Et il est très difficile de dépanner quand vous n'obtenez rien du tout. – tufelkinder

Questions connexes