[英]Filter ModelChoiceField by User in Django Admin Form
I'm new in Django and I have created a project with this structure: 我是Django的新手,并且创建了一个具有以下结构的项目:
model.py model.py
from django.contrib.auth.models import User, Group
class MyModel(models.Model):
created = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User, null=True, blank=True)
group = models.ForeignKey(Group, null=True, blank=True)
...
...
admin.py admin.py
class MyModelAdmin(admin.ModelAdmin):
form = MyModelForm
...
def queryset(self, request):
qs = super(MyModelAdmin, self).queryset(request)
# If super-user, show all records
if request.user.is_superuser:
return qs
# If user have group, show all records of the group
if request.user.groups.all().count() > 0:
return qs.filter(group=(request.user.groups.all()))
#Show only the records that the user have been created
return qs.filter(created_by=request.user)
I want to show only the records that are assigned to a specific Group. 我只想显示分配给特定组的记录。 It´s ok, but how could I create the same filter that I use in admin.py
to filter the choices by user´s group in my Django form? 可以,但是如何创建与admin.py
使用的过滤器相同的过滤器,以按Django表单中的用户组过滤选择? How could I pass the actual user that is logging to a ModelForm class? 如何传递登录到ModelForm类的实际用户?
Forms.py Forms.py
class MyModelForm(forms.ModelForm):
group = forms.ModelChoiceField(Group.objects.filter(id=####),
label=ugettext_lazy("Groups"), required=True)
Thanks! 谢谢!
You can't do it in the field definition as you'll need the request object. 您将无法在字段定义中执行此操作,因为您将需要请求对象。 I think the only way to do it is to define formfield_for_dbfield
on the admin class: 我认为唯一的方法是在admin类上定义formfield_for_dbfield
:
def formfield_for_dbfield(self, db_field, request, **kwargs):
field = super(MyModelAdmin, self).formfield_for_dbfield(db_field, request, **kwargs)
if db_field.name == 'groups':
field.queryset = field.queryset.filter(user=request.user)
return field
Haven't tested the code, so it might be wrong :-) 没有测试代码,所以可能是错误的:-)
With formfield_for_dbfield
i have founded the answer :) 使用formfield_for_dbfield
我已经找到了答案:)
admin.py admin.py
class MyModelAdmin(admin.ModelAdmin):
form = MyModelForm
...
def get_form(self, request, obj=None, **kwargs):
kwargs['formfield_callback'] = partial(self.formfield_for_dbfield, request=request)
return super(MyModelAdmin, self).get_form(request, obj, **kwargs)
def formfield_for_dbfield(self, db_field, **kwargs):
field = super(MyModelAdmin, self).formfield_for_dbfield(db_field, **kwargs)
if db_field.name == 'group':
field.queryset = field.queryset.filter(id__in=(kwargs['request'].user.groups.all()))
return field
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.