2

私はdjango-autocomplete-lightを使用していますdjango-autocomplete-light - モデルの主キーとは異なるフィールドを返す方法は?

モデルのフォームにオートコンプリートを使用したいと思います。フィールドは外部キーか何かではなく、ただ整数フィールドであり、オートコンプリートのために私は実際に同じモデルを使いたいと思います。

ただし、オートコンプリートからのクエリセットではIDが返され、フィールド "projektnummer"に入力します。

モデルの主キーではなく他のフィールドを返すようにオートコンプリートを設定する方法を教えてください。

また、整数フィールドにオートコンプリートウィジェットを使用すると、私はシンプルなフォームからワイヤードのエラーが発生するようです。

models.py

class KombiPublikation(models.Model): 
    typid = models.ForeignKey('KombiPublikationsTypMedium', verbose_name='Outputtyp', db_column='typid') # publikationstyp.id or publikationstypinfo.typid 
    [...] 
    projektnummer = models.IntegerField(verbose_name='Projektnr.', default=0, blank=True) 
[...] 

views.py

class SearchProjectinFormAutocomplete(autocomplete.Select2QuerySetView): 
    def get_queryset(self): 
     qs = KombiPublikation.objects.filter(typid__in=[222, 223, 224]).filter(zeigen=1) 

     if self.q: 
      qs = qs.filter(Q(projektnummer__contains=self.q)) 

     return qs 

forms.py

class KombiPublikationForm(forms.ModelForm): 

    class Meta: 
     model = KombiPublikation 
     #fields = [] 
     exclude = ['pub_sprache'] 
     widgets = { 
      'typid': autocomplete.ModelSelect2(url='output:typ-autocomplete', forward=['typtyp']), 
      'projektnummer': autocomplete.ModelSelect2(url='output:projekt-form-autocomplete'), 
     } 

答えて

1

私は答えを見つけました。

実際に、結果のオブジェクトから必要な変数を返すには、ベースautocomplete.Select2QuerySetViewからget_result_valueをオーバーライドする必要があります。 :)

しかし、私はまだ私のクリスピーな形でオートコンプリートウィジェットを使用することはできませんフォーム - そのための新しい質問を開いた('list' object has no attribute 'queryset' error when adding a autocomplete field to a model-formを参照)

def get_result_value(self, result): 
    """Return the value of a result.""" 
    return result.pk #change pk to the variable of your choice 
+0

それは魅力的に機能しました。この答えをありがとう。 –

0

私の最高の推測では、あなたがKombiPublikationFormの外にクエリを作っているということでしょうあなたのforms.pyのクラスではなく、の、一方

class SearchProjectinFormAutocomplete(autocomplete.Select2QuerySetView): 
    def get_queryset(self): 
     qs = BasePublikation.objects.filter(typid__in=[222, 223, 224]).filter(zeigen=1) 

     if self.q: 
      qs = qs.filter(projektnummer__contains=self.q) 

     return qs 

を試してみてください、私たちは希望クエリが動作をする可能性があります方法を知っているためのようKombiPublikationsTypMediumクラスの外観をしてどのように見たいと思うかもしれません。

これが役立ちますように!

--edit--

Q声明を取り払う試してみてください:qs = qs.filter(projektnummer__contains=self.q)

+0

申し訳ありませんが、私のミス。ベースパブリケーションは、フィールドを含む抽象基本クラスです。私はこの不必要な複雑さから私の質問を隠したかった。それに応じて名前を変更するのを忘れてしまった。 – teconomix

+0

KombiPublikationFormは正しいクラスです – teconomix

関連する問題