简体   繁体   English

如何过滤用户作为外键 django forms 中的选择?

[英]How can I filter users as a choice in a foreign key django forms?

I'm stuck with a problem to filter project managers from a foreign key field in django forms.我遇到了从 django forms 中的外键字段过滤项目经理的问题。 I want to exclude superusers and other user roles except project manager.我想排除超级用户和项目经理以外的其他用户角色。

Models.py模型.py

class Projects(models.Model):

id=models.AutoField(primary_key=True)
project_name=models.CharField(max_length=255)
project_manager=models.ForeignKey(CustomUser,on_delete=models.CASCADE, limit_choices_to={'is_project_manager__eq : 1 '})
client_name=models.ForeignKey(Clients,on_delete=models.CASCADE, null=True)
project_pic=models.ImageField(upload_to='static/website/project-images')
project_start_date=models.DateField(null=True)
project_end_date=models.DateField(null=True)
project_description=models.TextField(null=True)
created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(auto_now=True)
is_draft = models.BooleanField(default=True)
objects=models.Manager()

class Meta:
    verbose_name_plural = 'Project'

def __str__(self):
    return f'{self.project_name}'

Forms.py Forms.py

class ProjectForm(forms.ModelForm): 
class Meta: 
    model = Projects
    fields = ['project_name', 'project_manager', 'client_name', 'project_pic', 'project_start_date', 'project_end_date', 'project_description']

Views.py视图.py

def project_list(request):

projects = Projects.objects.all()

if request.method == 'POST':
    form = ProjectForm(request.POST, request.FILES)
    if form.is_valid():
        form.save()
        project_name = form.cleaned_data.get('project_name')
        messages.success(request, f'{project_name} has been successfully added.')
        return redirect('project_list')
else:
    form = ProjectForm()

context = {

    'projects' : projects,
    'form' : form,

}

template_name ='project-admin/project-list.html'
return render(request, template_name, context)

CustomUser/Models.py自定义用户/模型.py

Here is their own roles to set them as a project manager, inventory admin, and client这是他们自己的角色,可将他们设置为项目经理、库存管理员和客户

class CustomUser(AbstractUser):

is_inventory_admin = models.BooleanField('Is Inventory Admin', default=False)
is_project_manager = models.BooleanField('Is Project Manager', default=False)
is_client = models.BooleanField('Is Client', default=False)

class Meta:
    db_table = 'auth_user' 

You check the condition with:您检查条件:

class Projects(models.Model):
    # …
    project_manager = models.ForeignKey(
        CustomUser,
        on_delete=models.CASCADE,
        limit_choices_to={'is_project_manager': True}
    )
    # …

you can also explicitly exclude is_inventory_admin=True and is_client=True (in case a CustomUser can be two or three at the same time), with:您还可以明确排除is_inventory_admin=Trueis_client=True (如果CustomUser可以同时是两个或三个),具有:

class Projects(models.Model):
    # …
    project_manager = models.ForeignKey(
        CustomUser,
        on_delete=models.CASCADE,
        limit_choices_to={'is_project_manager': True, 'is_inventory_admin': False, 'is_client': False}
    )
    # …

Note : It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly.注意:通常使用settings.AUTH_USER_MODEL [Django-doc]引用用户 model 比直接使用User model [Django-doc] 更好 For more information you can see the referencing the User model section of the documentation .有关更多信息,您可以查看参考文档的User model部分


Note : normally a Django model is given a singular name, so Project instead of Projects .注意:通常 Django model 被赋予一个单数名称,因此Project而不是Projects

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM