如何限制Django raw_id_field的ForeignKey选择的选择 [英] How to limit choices of ForeignKey choices for Django raw_id_field
问题描述
当使用当呈现为选择框时,定义一个自定义 ModelForm
,以使用所需的选项设置该字段的queryset值.但是,使用 raw_id_fields
呈现时,此查询集似乎被完全忽略.它会生成该 ForeignKey
模型的链接,使您可以通过弹出窗口从该模型中选择任何记录.您仍然可以通过自定义URL来过滤这些值,但是我找不到通过 ModelAdmin
执行此操作的方法.
When rendered as a select box, it's simple to define a custom ModelForm
to set that field's queryset value with the choices to want. However, this queryset appears to be completely ignored when rendered using raw_id_fields
. It generates a link to that ForeignKey
's model, allowing you to select any record from that model via a popup window. You can still filter these values by customizing the URL, but I can't find a way to do this via a ModelAdmin
.
推荐答案
在Django 1.8/Python 3.4项目中,我使用类似于FSp的方法:
I use similar to FSp approach in my Django 1.8 / Python 3.4 project:
from django.contrib import admin
from django.contrib.admin import widgets
from django.contrib.admin.sites import site
from django import forms
class BlogRawIdWidget(widgets.ForeignKeyRawIdWidget):
def url_parameters(self):
res = super().url_parameters()
res['type__exact'] = 'PROJ'
return res
class ProjectAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['blog'].queryset = Blog.objects.filter(type='PROJ')
self.fields['blog'].widget = BlogRawIdWidget(rel=Project._meta.get_field('blog').remote_field, admin_site=site)
class Meta:
# Django 1.8 convenience:
fields = '__all__'
model = Project
class ProjectAdmin(admin.ModelAdmin):
form = ProjectAdminForm
raw_id_fields = ('blog',)
在 django.admin
中仅选择 blog.type =='PROJ'
作为外键 Project.blog
.不幸的是,因为最终用户可能会选择任何东西.
to select only blog.type == 'PROJ'
as foreign key Project.blog
in django.admin
. Because end-users may and will to select anything, unfortunately.
这篇关于如何限制Django raw_id_field的ForeignKey选择的选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!