python - 模型管理器的 Django forms.ModelChoiceField 查询集问题
问题描述
我无法在 ModelForm 中创建 ModelChoiceField 查询集。相关的 model.objects 管理器已被覆盖以过滤结果,以便仅获取实际用户创建的实例。这是我的模型:
class Bloc(ModelPrive):
TYPE_BLOC = (
('pleinchamps', 'plein champs'),
('tunnel', 'tunnel'),
('pepiniere', 'pépinière'),
('autre', 'autre'),
)
nb_planche = models.IntegerField(null=True)
caracteristique = models.CharField(max_length=200, null= True, blank=True)
geom = models.PolygonField(srid=4326)
type_bloc = models.CharField(max_length=200, blank=True, choices=TYPE_BLOC)
nom = models.CharField(max_length=200, null=True, unique= True)
class ModelPrive(models.Model):
created_by = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL, editable=False)
class Meta:
abstract = True
objects = ModelPriveManager()
class ModelPriveManager(models.Manager):
def get_queryset(self):
user = get_current_user()
return super().get_queryset().filter(created_by=user)
在我的经理中, get_current_user() 返回已被自定义中间件拦截的实际用户。
这是我的表格:
class BlocFormList(ModelForm):
choix_bloc = forms.ModelChoiceField(queryset = Bloc.objects.all().order_by('nom'), required=True)
class Meta:
model = Bloc
fields = ['choix_bloc']
这是我的观点:
def planification(request):
form_bloc = BlocFormList()
if request.method == 'POST':
# some other code
return render(request, 'planification.html', locals())
问题是,当我在视图中执行 Bloc.objects.all() 时,我得到了预期的答案 (Bloc.objects.filter(created_by=user)) 但是当它在模型表单的查询集中完成时,它什么也不返回(好像没有活动用户)。
经过一番检查,我发现模型表单查询集甚至没有进入管理器。
如果有人知道如何纠正这个问题,我没有更多的想法。
解决方案
看到这篇文章Django ModelForm overriding __init__,我终于通过覆盖我的 ModelForm 的init找到了我的解决方案:
class BlocFormList(ModelForm):
blocs = None
choix_bloc = forms.ModelChoiceField(label='Blocs', queryset=blocs, required=True)
def __init__(self, *args, **kwargs):
self.blocs = Bloc.objects.all()
super(BlocFormList, self).__init__(*args, **kwargs)
self.fields['choix_bloc'].queryset = self.blocs
class Meta:
model = Bloc
fields = ['choix_bloc']
这工作正常。
推荐阅读
- python-3.x - 熊猫将一个值重命名为列中的另一个值并在另一列中添加相应的值
- javascript - 如何通过地理位置验证带有国家代码的注册表单电话输入字段
- java - 一段时间后无限循环失控
- python - 使用 buildozer 在 android 设备上部署 kivy 应用程序时出现问题(#waiting for application to start)
- javascript - 使用 javascript 扫描 html 虚拟键
- filter - Gremlin 后过滤器路径
- r - 使用 select(contains) 用另一个 data.frame 过滤 data.frame
- c++ - 将基于文本的列数据存储到数组 C++ 中
- python - 使用 Watchtower 进行 Python 快速 API 日志记录
- php - 定制器 Wordpress - 菜单和小部件的功能