【问题标题】:Django admin.py ValueError when trying to save manytomany fieldDjango admin.py ValueError 尝试保存多对多字段时
【发布时间】:2020-09-11 03:35:44
【问题描述】:

我正在尝试在 Django 中创建一个具有多对多字段的模型,并且使用默认的 admin.py 界面我得到一个 ValueError: need to have a value for field "id" before this many-to-many relationship can be使用。

我知道您需要在填充多对多字段之前保存实例,因为它是一个单独的表,但是我不是手动保存而是依赖 admin.py。我的应用程序中有一个单独的模型,它有一个多对多字段,通常保存在 admin.py 中,所以我不确定问题出在哪里

我的模型代码是:

class CaseFeature(models.Model):
"""Case-specific history features"""
    case = models.ForeignKey(
            Case, 
            on_delete=models.CASCADE, 
            related_name="features",
            db_index=True)
    feature_name = models.ForeignKey(
            CoreFeature, 
            on_delete=models.PROTECT,
            db_index=True)
    response = models.TextField("Patient Response", max_length=500)
    clerking_text = models.TextField(max_length=400)
    tooltip = models.CharField(max_length=200, blank=True)
    important = models.BooleanField()
    answered_clarifying_qs = models.ManyToManyField(CoreClarifying, blank=True)

    def clean(self):
        # Make sure answered_clarifying are valid for this symptom
        if self.answered_clarifying_qs not in self.feature_name.clarifying_qs:
            raise ValidationError(_('Answered clarifying Qs do not match this symptom'))


    def __str__(self):
        return f"{self.case} - {self.feature_name}"

我的 admin.py 是:(当我将其注释掉时没有任何变化我仍然得到一个值错误)

class CaseFeatureAdmin(admin.ModelAdmin):
        formfield_overrides = {
        models.TextField: {'widget': forms.Textarea(attrs={'rows':5})}
    }
...
admin.site.register(CaseFeature, CaseFeatureAdmin)

【问题讨论】:

    标签: python django django-admin many-to-many django-orm


    【解决方案1】:

    错误是由于在保存之前发生的 clean 方法。解决方案是将干净的验证规则移到 ModelForm 中,而不是这样!

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 2021-04-30
      • 2023-04-02
      • 2014-10-02
      • 2019-08-05
      • 1970-01-01
      相关资源
      最近更新 更多