django - 不同用户的不同内联
django - different inlines for different users
我有这些模型
class Office(models.Model):
name = models.CharField(max_length=255)
class User(models.Model):
name = models.CharField(max_length=255)
status = models.SmallIntegerField()
office = models.ForeignKey(Office, on_delete=models.SET_NULL, null=True)
class Inspection(models.Model):
place = models.CharField(max_length=255, null=True, blank=True)
class Jobs(models.Model):
inspection = models.ForeignKey(Inspection, on_delete=models.CASCADE)
inspector = models.ForeignKey(User, on_delete=models.SET_NULL)
cost = models.DecimalField(max_digits=20, decimal_places=2)
我有不同的用户:普通用户(status=1
)和管理员(status=2
)。
普通用户只能在同一办公室使用 Inspectors
制作和查看 Jobs
。
管理员可以将任何用户放入 Inspectors
并查看所有 Jobs
。
我可以为同一办公室的用户筛选职位列表:
class JobAdmin(admin.StackedInline):
model = Job
extra = 0
def get_queryset(self, request):
qs = super(JobAdmin, self).get_queryset(request)
if request.user.status in [1]:
qs = qs.filter(inspector__office=request.user.office)
return qs
class InspectionAdmin(ModelAdmin):
list_display = ['place']
inlines = [JobAdmin]
但是我如何添加额外的编辑过滤器?
如果不是内联表单,我会这样做:
class JobAdminForm(ModelForm):
def __init__(self, *args, **kwargs):
super(JobAdminForm, self).__init__(*args, **kwargs)
if self.user.status == 1: #common user
self.fields['inspector'].queryset = Inspector.objects.filter(office=self.user.office)
class Meta:
model = Jobs
fields = '__all__'
class JobAdmin(ModelAdmin):
form = JobAdminForm
def get_form(self, request, obj=None, **kwargs):
form = super(JobAdmin, self).get_form(request, **kwargs)
form.user = request.user
return form
也许这段代码会有帮助:
class JobAdmin(admin.StackedInline):
model = Job
extra = 0
def get_queryset(self, request):
qs = super(JobAdmin, self).get_queryset(request)
if request.user.status in [1]:
qs = qs.filter(inspector__office=request.user.office)
return qs
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
if db_field.name == "inspector" and request.user.status == 1:
kwargs['queryset'] = Inspector.objects.filter(office=request.user.office)
return super().formfield_for_foreignkey(db_field, request, **kwargs)
P.S。 Link 至 Django 文档:formfield_for_foreignkey
我有这些模型
class Office(models.Model):
name = models.CharField(max_length=255)
class User(models.Model):
name = models.CharField(max_length=255)
status = models.SmallIntegerField()
office = models.ForeignKey(Office, on_delete=models.SET_NULL, null=True)
class Inspection(models.Model):
place = models.CharField(max_length=255, null=True, blank=True)
class Jobs(models.Model):
inspection = models.ForeignKey(Inspection, on_delete=models.CASCADE)
inspector = models.ForeignKey(User, on_delete=models.SET_NULL)
cost = models.DecimalField(max_digits=20, decimal_places=2)
我有不同的用户:普通用户(status=1
)和管理员(status=2
)。
普通用户只能在同一办公室使用 Inspectors
制作和查看 Jobs
。
管理员可以将任何用户放入 Inspectors
并查看所有 Jobs
。
我可以为同一办公室的用户筛选职位列表:
class JobAdmin(admin.StackedInline):
model = Job
extra = 0
def get_queryset(self, request):
qs = super(JobAdmin, self).get_queryset(request)
if request.user.status in [1]:
qs = qs.filter(inspector__office=request.user.office)
return qs
class InspectionAdmin(ModelAdmin):
list_display = ['place']
inlines = [JobAdmin]
但是我如何添加额外的编辑过滤器?
如果不是内联表单,我会这样做:
class JobAdminForm(ModelForm):
def __init__(self, *args, **kwargs):
super(JobAdminForm, self).__init__(*args, **kwargs)
if self.user.status == 1: #common user
self.fields['inspector'].queryset = Inspector.objects.filter(office=self.user.office)
class Meta:
model = Jobs
fields = '__all__'
class JobAdmin(ModelAdmin):
form = JobAdminForm
def get_form(self, request, obj=None, **kwargs):
form = super(JobAdmin, self).get_form(request, **kwargs)
form.user = request.user
return form
也许这段代码会有帮助:
class JobAdmin(admin.StackedInline):
model = Job
extra = 0
def get_queryset(self, request):
qs = super(JobAdmin, self).get_queryset(request)
if request.user.status in [1]:
qs = qs.filter(inspector__office=request.user.office)
return qs
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
if db_field.name == "inspector" and request.user.status == 1:
kwargs['queryset'] = Inspector.objects.filter(office=request.user.office)
return super().formfield_for_foreignkey(db_field, request, **kwargs)
P.S。 Link 至 Django 文档:formfield_for_foreignkey