【问题标题】:Getting FieldError in modelformset factory in django view.py在 django view.py 的 modelformset 工厂中获取 FieldError
【发布时间】:2019-03-22 22:12:59
【问题描述】:

我得到 FieldError 为:

为 AssistantNotes 指定的未知字段(注释日期)

当我调用页面时。它抛出这个错误。我正在使用 Django 1.9.5 和 python 2.7。 我在我的数据库中的 AssistantNotes 表中记录了字段。如果我在我的视图中从 modelformset_factory 行中删除“notedate”,它会起作用。我无法解决为什么它没有显示注释,尽管它在数据库和模型中。并产生错误。该字段已在模型中。

我的看法是:

def edit_assistant_notes(request):
    isassistantsuperadmin = getUserPermissions(request) #Yes if 1, no if 0
    list = getUserType(request)
    userisassistant = list[2]
    if userisassistant == "YES" or isassistantsuperadmin ==1: 
        list = getUserType(request)
        type = list[0]
        usertype = list[1] #"Nöbetçi Muavin":1 , "Yetkili":2
        if request.method == 'GET':
            if AssistantNotes.objects.filter(notedate=nicosia_date(datetime.today()).date()).count() == 0:
                AssistantNotesFormsetFactory = modelformset_factory(AssistantNotes, fields=('time', 'notedate', 'categories', 'type', 'dailynote',))
            else:
                AssistantNotesFormsetFactory = modelformset_factory(AssistantNotes, fields=('time', 'notedate', 'categories', 'type', 'dailynote',), can_delete=True)
            if usertype == 1:
                formset = AssistantNotesFormsetFactory(queryset=AssistantNotes.objects.filter(notedate=nicosia_date(datetime.today()).date(), type=type))
            elif usertype == 2:
                formset = AssistantNotesFormsetFactory(queryset=AssistantNotes.objects.all().order_by("notedate", "time"))
            helper = TableInlineHelper()
            return render(request, 'edit-assistant-notes.html', {'formset': formset, 'helper': helper})

我的模型是:

    class AssistantNotes(BaseModel):
    categories = models.CharField(choices=CATEGORIES, default="GENERAL", max_length=100, verbose_name=_("CAT"))
    time = models.CharField(choices=TIME, default="-------------", max_length=20, verbose_name=_("Time"))
    dailynote = models.TextField(null=True, blank=True, verbose_name=_("Add Note"))
    writer = models.TextField(null=True, blank=True, verbose_name=_("Adder"))
    notedate = models.DateField(auto_now_add=True, db_index=True, verbose_name=_("Date"))
    type = models.CharField(choices=SCHOOLTYPE, default="---", max_length=100, verbose_name=_("SchoolType"))

    def __unicode__(self):
        return "%s / %s" % (self.dailynote, self.categories)

    class Meta:
        ordering = ['dailynote']

【问题讨论】:

  • auto_now_add=True的表单为什么还要包含?
  • 页面的查看者应该会看到输入注释的日期。会有几个不同日期的笔记。用户将按日期区分要编辑的注释。不会更改日期。只是显示。
  • >DateField.auto_now_add¶ >按照目前的实现,设置auto_now或auto_now_add为True会导致该字段有editable=False >Field.editable¶ 如果为False,该字段将不会显示在后台或任何其他 ModelForm 见docs.djangoproject.com/en/2.1/ref/models/fields
  • 您可能需要从中删除 auto_now_add,然后将该字段的 readonly 属性设置为 True。
  • 那么我应该在视图的代码中手动添加日期吗?是否可以将表单中的 editable=False 字段显示为只读?

标签: python django python-2.7 django-forms django-1.9


【解决方案1】:

如何强制此字段可编辑?

您可以覆盖模型的 save() 方法,而不是设置 auto_now_add,例如

class AssistantNotes(BaseModel):
    ....
    notedate = models.DateField(db_index=True, verbose_name=_("Date"))
    def save(self, *args, **kwargs):
        if not self.id:
            self.notedate = timezone.now()
        return super(AssistantNotes, self).save(*args, **kwargs)

【讨论】:

  • 我们在 models.py 中这样做吗?
  • 时区每次都会更新吗?因为我通过将模型字段默认值设置为 timezone.now() 尝试了类似的解决方案,尽管服务器时间发生了变化,但它没有更新时间。只有当我每天重新启动一次 django 时才会更新它。
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多