【问题标题】:Django don't save ModelMultipleChoiceField in adminDjango 不在管理员中保存 ModelMultipleChoiceField
【发布时间】:2021-08-03 03:16:23
【问题描述】:

我想过滤 Skill_ids 字段并为每个 SkillType 创建 3 个“抽象”字段,但现在它没有在管理站点中保存这个 hard_skills 字段。

型号

class Task(models.Model):
    name = models.CharField(max_length=255)
    category_id = models.ForeignKey('Category', on_delete=models.RESTRICT, null=True)
    level_id = models.ForeignKey('Level', on_delete=models.RESTRICT, null=True)
    permission_ids = models.ManyToManyField('Permission', blank=True)
    skill_ids = models.ManyToManyField('Skill', blank=True)

表格

class TaskForm(ModelForm):
    hard_skills = ModelMultipleChoiceField(Skill.objects.filter(skill_type=SkillType.HARD_SKILL),
                                           widget=FilteredSelectMultiple("Hard Skills", False), required=False)

    class Meta:
        model = Task
        exclude = ['skill_ids']

管理员

@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
    list_per_page = 25
    list_display = ['name', 'category_id', 'level_id', 'get_permissions']
    list_filter = ['category_id']
    filter_horizontal = ['permission_ids', 'skill_ids']
    form = TaskForm

    def save_model(self, request, obj, form, change):
        for hard_skill in form.cleaned_data.get('hard_skills'):
            obj.skill_ids.set(hard_skill)
        super().save_model(request, obj, form, change)

【问题讨论】:

  • super().save_model,将覆盖它。

标签: django django-forms django-admin


【解决方案1】:

ManyToManyField 方法 set 需要一个列表,所以应该这样做:

obj.skill_ids.set(form.cleaned_data.get('hard_skills'))

【讨论】:

  • 我写了这样的东西,但它仍然没有保存 ` def save_model(self, request, obj, form, change): super().save_model(request, obj, form, change) obj.skill_ids .set(form.cleaned_data.get('hard_skills')) obj.save() `
  • 如果你读过Django documentation example,超级方法应该在最后,不需要调用obj.save()。但接下来的问题是,超级方法是否会根据表单修改 obj 并更改参数,我不确定。然后,我会尝试在模型的方法 save() 而不是管理员的 save_model() 中实现它。
猜你喜欢
  • 2019-07-09
  • 2015-04-18
  • 2014-02-21
  • 2015-12-17
  • 2018-07-23
  • 2014-12-20
  • 2011-03-30
  • 2012-04-01
  • 2019-08-04
相关资源
最近更新 更多