Django:ManyToManyField.limit_choices_to似乎无法正常工作

时间:2017-08-18 07:47:20

标签: django forms django-models manytomanyfield limit-choices-to

我有以下模特:

models.py

def limit_name_choices():
    return {"pk__gt": Name.objects.last().pk} 

class Name(models.Model):
    name = models.CharField(max_length=100)
    primary = models.BooleanField()


class Robject(models.Model):
    project = models.ForeignKey(to=Project, null=True)
    author = models.ForeignKey(
        to=User, null=True, related_name="robjects_in_which_user_is_author")
    create_by = models.ForeignKey(
        to=User, related_name="robjects_created_by_user", null=True)
    create_date = models.DateTimeField(null=True)
    modify_by = models.ForeignKey(to=User, null=True)
    name = models.ManyToManyField(
        "Name",
        related_name="robject_name",
        help_text='The name of robject',
        limit_choices_to= get_last_name_pk()
    )

views.py

def robject_create_view(request, *args, **kwargs):
    if request.method == "POST":
        form = RobjectForm(request.POST)
        if form.is_valid():
            return redirect("/")
    else:
        form = RobjectForm()
    return render(request, 'robjects/create_robject.html', {"form":form})

forms.py

class RobjectForm(forms.ModelForm):
    class Meta:
        model = Robject
        fields = '__all__'

        # this comes from django-addanother (admin popup functionality)
        widgets = {
            'name': AddAnotherWidgetWrapper(
                forms.SelectMultiple,
                reverse_lazy('add_name', args=['proj_1']),
            ),
        }

我创建了模仿管理员的Robject创建表单。这意味着我在ModelMultipleChoiceField name 字段旁边添加了“加号按钮”,这会弹出我可以创建新名称的位置。每次打开我的robject创建表单时,我打算有空的 name 字段(没有选择)。不幸的是,当我刷新表单页面时,我看到以前创建的名称。

我的问题是,每次实例化新表单时都不会调用函数limit_name_choices。这是一个错误,还是我做错了什么?

来自django文档: https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey.limit_choices_to

  

如果limit_choices_to使用了callable,则会调用它   实例化新表单的时间。它也可以在模型时调用   验证,例如管理命令或管理员。该   admin构造查询集以在各种边缘验证其表单输入   多次出现这种情况,因此有可能是您的可调用者   多次调用。

0 个答案:

没有答案