2017-01-13 8 views
0

オブジェクトを編集するときに、djangoの管理ページのドロップダウンフィールドの内容をフィルタリングするにはどうすればよいですか? 例:フィルタdjango管理者多対1エディタ

class Question(models.Model): 
    creator = models.ForeignKey(User) 
    body = models.CharField(max_length=200) 
    category = models.ForeignKey(Category) 

class Category(models.Model): 
    name = models.CharField(max_length=200) 
    creator = models.ForeignKey(User) 

class QuestionAdmin(TeacherModelAdmin): 
    fieldsets = [ 
     (None, {'fields': ['body', 'category']}), 
    ] 
    #Filter by request.user == creator ? 
+0

@Roknerさん、回答があなたの期待を満たしていない場合、または最も満足できる回答を受け入れる場合は、コメントをお書きください。 – glowka

答えて

0

あなたはそれを行うに公式方法がないように見えます管理

class QuestionAdmin(TeacherModelAdmin): 
    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
    if db_field.name == "category": 
     kwargs["queryset"] = Category.objects.filter(creater=request.user) 
    return super(QuestionAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 
0

formfield_for_foreignkeyメソッドをオーバーライドすることができます。

ただし、BaseModelAdminで定義され、ModelAdminで継承されたget_field_querysetフックを使用できます。解決策は、次のようになります。あなたは本当にそれは、公式のAPIの一部であることは誰かが事前に非推奨の警告を追加することなく、このフックを変更したとき、あなたがトラブルに巻き込まれる可能性を意味していない必要がある場合は、このソリューションを適用する前に

class QuestionAdmin(TeacherModelAdmin): 
    fieldsets = [ 
     (None, {'fields': ['body', 'category']}), 
    ] 

    def get_field_queryset(self, db, db_field, request): 
     # Bahaviour for your field 
     if db_field.name == 'category': 
      return db_field.remote_field.model.filter(creator=request.user) 
     # Default behaviour unchanged 
     return super(OrderAdmin,self).get_field_queryset(db, db_field, request) 

よく考えてください。 。