django ModelMultipleChoiceField用于已关联对象的查询集/过滤器

时间:2010-12-02 20:13:40

标签: django forms filter django-queryset

我有一个与Category

有很多关系的Profile对象

class Profile(models.Model):
    . . . 
    category = models.ManyToManyField(Category, blank=True)

在我的表单中,我想显示仅与配置文件关联的类别的复选框 以下代码将显示所有类别。


class ProfileForm(ModelForm):
    . . .
    category = forms.ModelMultipleChoiceField(Category.objects.all(),
                  widget=forms.CheckboxSelectMultiple())

如何编写查询集以便仅显示与配置文件关联的类别? 我有各种变化:


    category = forms.ModelMultipleChoiceField(Category.objects.filter(id__in=Profile.category.all()), widget=forms.CheckboxSelectMultiple())

是否有此错误:'ReverseManyRelatedObjectsDescriptor'对象没有属性'all'

2 个答案:

答案 0 :(得分:0)

据我所知,关系“类别”只能与Profile 实例(提供相关类别)相关联,而不能与类Profile本身相关联。这就是您收到错误消息的原因。

如果您在示例中使用实际的Profile实例替换了Profile(我读到的是您实际尝试实现的内容),那么它会更好。

category=forms.ModelMultipleChoiceField(
    Category.objects.filter(id__in=your_profile_instance.category.all()),
    widget=forms.CheckboxSelectMultiple()
)

或只是

category=forms.ModelMultipleChoiceField(
    queryset=your_profile_instance.category.all()),
    widget=forms.CheckboxSelectMultiple()
)

我是否正确理解了您的问题?

答案 1 :(得分:0)

哇,这是 10 年前问过的……但我的想法可能对将要审查此问题的开发人员有用。我也遇到过类似的挑战。

简单的方法是注释掉这个:

stages:
  - test
  - package
  - deploy
  - cleanup approval
  - cleanup


build docker image review app:
  stage: package
  script:
    - echo hello
  rules:
    - if: $CI_MERGE_REQUEST_ID

deploy review app:
  stage: deploy
  image: alpine/helm:3.5.0
  dependencies: []
  script:
    - echo hello
  environment:
    name: review/$CI_PROJECT_NAME-$CI_MERGE_REQUEST_ID
    url: https://$CI_PROJECT_NAME-$CI_MERGE_REQUEST_ID.reviewapps.tdhb2bdev.com
    on_stop: stop review app
    auto_stop_in: 1 day
  needs:
    - build docker image review app
  rules:
    - if: $CI_MERGE_REQUEST_ID

stop review app:
  stage: cleanup approval
  script: 
    - echo helm uninstall xxxx
    - echo aws ecr batch-delete-image xxxx
  dependencies: []
  environment:
    name: review/$CI_PROJECT_NAME-$CI_MERGE_REQUEST_ID
    action: stop
  needs:
    - deploy review app
  rules:
    - if: $CI_MERGE_REQUEST_ID
      when: manual
      allow_failure: true

lol 然后在下面,在列出字段后添加:

#category=forms.ModelMultipleChoiceField(
#    Category.objects.filter(id__in=your_profile_instance.category.all()),
#    widget=forms.CheckboxSelectMultiple()
#)

是的....

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method