Как установить другой список параметров formfield_for_foreignkey для разных форм, таких как add и change

#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