【问题标题】:django-autocomplete-light - how to return a different field then a models primary key?django-autocomplete-light - 如何返回与模型主键不同的字段?
【发布时间】:2016-10-06 15:32:52
【问题描述】:

我正在使用 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'),
        }

【问题讨论】:

    标签: jquery django jquery-select2 django-crispy-forms django-autocomplete-light


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      我最好的猜测是,您是在 forms.py 中的 KombiPublikationForm 类中进行查询,而不是从 models.py 中的 BasePublikation 中进行查询,试试

      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 类的外观,以便了解查询的行为方式。

      希望这会有所帮助!

      --编辑--

      尝试去掉 Q 语句:qs = qs.filter(projektnummer__contains=self.q)

      【讨论】:

      • 对不起,我的错误。基本发布是包含该字段的抽象基类。我想保护我的问题免受这种不必要的复杂性的影响。只是忘了相应地重命名它。
      猜你喜欢
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2017-03-26
      • 1970-01-01
      • 2015-10-15
      • 2016-03-27
      相关资源
      最近更新 更多