45

私はこれらのモデルを持っています:

class Entity(models.Model):
       name=models.CharField(max_length=100)
      
class Theme(models.Model):
   name=models.CharField(max_length=100)
   entity=models.OneToOneField(Entity)

class Company(models.Model):
    name=models.CharField(max_length=100)
    theme=models.OneToOneField(Theme,null=True,blank=True)

theme管理者にを追加するときにフィールドをフィルタリングしたいのですがCompany、次のようになります。

class CompanyAdmin(admin.ModelAdmin):
   def queryset(self, request):
      qs = super(CompanyAdmin, self).queryset(request)
      qs.theme.queryset = Theme.objects.filter(name__iexact='company')
      return qs
      
admin.site.register(Company, CompanyAdmin)

私は多くのことを試しましたが、何もうまくいきませんでした!これどうやってするの?

4

7 に答える 7

57

render_change_form次の方法を使用します。

class CompanyAdmin(admin.ModelAdmin):
    def render_change_form(self, request, context, *args, **kwargs):
         context['adminform'].form.fields['theme'].queryset = Theme.objects.filter(name__iexact='company')
         return super(CompanyAdmin, self).render_change_form(request, context, *args, **kwargs)
于 2012-04-16T22:17:29.110 に答える
47

私は実際にget_formそのようにすることを好みます:

ジャンゴ<2:

class CompanyAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super(CompanyAdmin, self).get_form(request, obj, **kwargs)
        form.fields['theme'].queryset = Theme.objects.filter(name__iexact='company')
        return form

Django> = 2

class CompanyAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super(CompanyAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['theme'].queryset = Theme.objects.filter(name__iexact='company')
        return form
于 2015-10-01T07:43:17.443 に答える
16

こちらをご覧くださいhttp://books.agiliq.com/projects/django-admin-cookbook/en/latest/filter_fk_dropdown.html

@admin.register(Hero)
class HeroAdmin(admin.ModelAdmin, ExportCsvMixin):
    ...
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "category":
            kwargs["queryset"] = Category.objects.filter(name__in=['God', 'Demi God'])
        return super().formfield_for_foreignkey(db_field, request, **kwargs)
于 2018-12-06T14:23:55.897 に答える
6

Django 3では簡単です:

class CompanyAdmin(admin.ModelAdmin):
    list_display = ('name','theme')
    list_filter = ('theme__name',)

admin.site.register(Company,CompanyAdmin)

これにより、画面の右側にテーマの名前のリストを含むフィルターが表示されます。

于 2020-04-13T12:43:40.690 に答える
3

もう1つのオプションは、themeフィールドのqueryset属性がニーズに合わせて微調整されるカスタムモデルフォームを作成することです。

class CompanyForm(ModelForm):
    class Meta:
        model = CompanyForm
        fields = __all__ # or a tuple of fields

    def __init__(self, *args, **kwargs):
        super(CompanyForm, self).__init__(*args, **kwargs)
        if self.instance: # Editing and existing instance
            self.fields['theme'].queryset = Theme.objects.filter(name__iexact='company')

このモデルフォームは、django管理エリアの外でも再利用できます。

于 2017-02-23T15:56:13.500 に答える
0

親ModelAdminクラス(他のすべてのModelAdminが継承する)のforeignKeyクエリセットにフィルターを追加する必要に直面しました。つまり、必要なモデルを正確に知ることができません。これが私の解決策です。db_field.related_model.objects.filter()

class TSModelAdmin(admin.ModelAdmin):
   exclude = ('site',)
    ...

      def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.related_model:
            kwargs["queryset"] = 
            db_field.related_model.objects.filter(site=request.user.user_profile.site)
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

使用されたdjangoバージョン2.2.10

于 2020-02-14T08:34:32.830 に答える
0

少し無関係ですが、これに似ているので、ここに投稿します。

ModelForm外部キーフィールドのNULL選択選択を削除する方法を探していました。ここで他の回答で行われているように、クエリセットをフィルタリングできると最初に思いましたが、それは機能しませんでした。

次のように、pk値がNULLであるエントリをフィルタリングできることがわかりましたget_form


class CompanyAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        # remove null choice
        form.base_fields["theme"].choices = ((pk, display) for pk, display in form.base_fields["theme"].choices if pk)
        return form
于 2020-11-03T15:48:01.120 に答える