【问题标题】:Limit choices to将选择限制为
【发布时间】:2009-08-06 14:53:42
【问题描述】:

我有一个名为 Project 的模型,它有一个 m2m 字段用户。我有一个带有 FK 项目的任务模型。它有一个字段assigned_to。如何将assigned_to 的选择限制为仅限当前项目的用户?

【问题讨论】:

    标签: python django-models


    【解决方案1】:

    你可以用另一种方式做到这一点,使用这个漂亮的表单工厂技巧。

    def make_task_form(project):
        class _TaskForm(forms.Form):
            assigned_to = forms.ModelChoiceField(
                  queryset=User.objects.filter(user__project=project))
    
            class Meta:
                model = Task
        return _TaskForm
    

    然后从您的视图代码中,您可以执行以下操作:

    project = Project.objects.get(id=234)
    form_class = make_task_form(project)
    ...
    form = form_class(request.POST)
    

    【讨论】:

      【解决方案2】:

      您需要创建一个custom form for the admin

      您的表单应该包含一个ModelChoiceField,您可以在其中指定一个定义可用选项的查询集参数。此表单可以是 ModelForm。

      (以下示例假设用户对您的项目模型具有 FK)

      forms.py

      from django import forms
      
      class TaskForm(forms.ModelForm):
          assigned_to = forms.ModelChoiceField(queryset=Users.objects.filter(user__project=project))
      
          class Meta:
              model = Task
      

      然后将表单分配给 ModelAdmin。

      admin.py

      from django.contrib import admin
      from models import Task
      from forms import TaskForm
      
      class TaskAdmin(admin.ModelAdmin):
          form = TaskForm
      admin.site.register(Task, TaskAdmin)
      

      【讨论】:

      • 我的用户没有我的项目模型的 FK。但我的项目模型有一个 M2M 字段用户。
      • 这个想法是正确的,但给出的代码将不起作用,因为“项目”变量未定义。查询集参数的右侧必须是实际值或变量,而不是模型上的字段。您实际上需要在此处覆盖表单的 __init__ 方法才能使其正常工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多