#python-3.x #django-forms #django-admin-filters
#python-3.x #django-forms #django-admin-filters
Вопрос:
Я определил модель с именем Emp (employees), как показано ниже:
from django.db import models
from django.contrib.auth.models import User
class Emp(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
empid = models.PositiveIntegerField(unique=True)
cnname = models.CharField(max_length=20)
gender = models.BooleanField(default=True)
birthdate = models.DateField(default=None, blank=True, null=True)
joindate = models.DateField()
islogi = models.BooleanField(default=True)
isleave = models.BooleanField(default=False)
leavedate = models.DateField(default=None, blank=True, null=True)
В Admin.py У меня есть следующий код:
from django.contrib import admin
from django.contrib.auth import get_user_model
from .models import Emp
class EmpAdmin(admin.ModelAdmin):
list_display = ('id','empid','cnname','gender','birthdate','joindate',
'islogi','isleave','leavedate')
ordering = ('empid',)
search_fields = ['empid','cnname']
list_per_page = 12
exclude = ('isleave','leavedate',)
# for list view, if not admin just show emp self info
# for admin all employees will be listed.
def get_queryset(self, request):
qs = super().get_queryset(request)
if request.user.is_superuser:
return qs
else:
user = get_user_model()
return qs.filter(empid=Emp.objects.get(user_id=user.objects.get(username=request.user).id).empid)
# this is used for form add and change actions
# but I want to add and change have different option list
# add just list the users which are not employees
# change list the users which are not employees employee self
def formfield_for_foreignkey(self, db_field, request, **kwargs):
print("self", self)
print("db_field", db_field)
print("build_absolute_uri() => ", request.build_absolute_uri())
if db_field.name == 'user':
print("kwargs => ", kwargs)
users = get_user_model()
u = users.objects.all()
uidlist = []
for x in range(len(u)):
uidlist.append(u[x].id)
e = Emp.objects.all()
for x in range(len(e)):
uidlist.remove(e[x].user_id)
kwargs["queryset"] = users.objects.filter(id__in=uidlist)
return super().formfield_for_foreignkey(db_field, request, **kwargs)
admin.site.register(Emp, EmpAdmin)
Над «formfield_for_foreignkey» указан тот же список параметров для «пользовательского» списка параметров. Как я могу переопределить список для действий «добавить» и «изменить», чтобы они могли использовать разные списки опций?
Ответ №1:
Вы можете использовать переданный запрос, чтобы проверить, является ли запрос изменением или добавлением:
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if "/add/" in request.path:
#add logic
elif "/change/" in request.path:
#change logic