【问题标题】:Remove field from a subclass of base abstract class Django从基本抽象类 Django 的子类中删除字段
【发布时间】:2011-06-18 09:22:28
【问题描述】:

我正在创建一个需要评论系统的应用程序。我决定使用 Django 的评论应用程序,但需要对其进行一些更改。首先,我不希望用户的电子邮件 ID 是强制性的,接下来我需要一个选项来附加带有评论的文件。

因此我决定从 BaseCommentAbstractModel 继承。现在我需要覆盖 user_email 是

user_email= models.EmailField(max_length=100, blank=True)

并添加另一个字段

file = models.FileField(upload_to='data/files')

我的代码应该是这样的:

from django.db import models
from django.contrib.comments.models import  BaseCommentAbstractModel

class CommentWithFile(BaseCommentAbstractModel):
    '''This is a hack of the Comment model to remove email and add a filefield'''
    user_email = models.EmailField(max_length=100, blank=True)
    file = models.FileField(upload_to='data/files')

但这不起作用。 user_email 仍然是强制性的。有什么想法吗?

【问题讨论】:

    标签: python django base-class


    【解决方案1】:

    您确定问题与模型有关吗? BaseCommentAbstractModel 甚至没有定义 user_email,它只存在于主要的 Comment 模型中——无论如何它都被定义为 blank=True

    我认为您更有可能需要提供自定义表单。主要的CommentDetailsForm 不是模型表单——它手动定义了它的字段,包括一个必需的email 字段。听起来你也需要覆盖它。

    【讨论】:

    • 谢谢,我会尝试创建一个表单。但是让我们假设我从评论继承。有没有可能改变它?谷歌搜索我发现在 .96 版本中有一个名为 META 的类,我可以在其中添加 remove_field = ('user_name',) 但这不起作用。
    【解决方案2】:

    只需借助 django 通用视图创建自定义表单。

    Models.py 应该类似于:

    from django.utils.translation import ugettext_lazy as _
    from django.db import models
    from django import forms
    
        class Comments(models.Model):
            name = models.CharField(_('Name'), max_length=30)
            email = models.EmailField(_('Email'), blank=True, null=True)
            comment = models.TextField(_('Comment'))
            date = models.DateTimeField(_('Date'), auto_now_add=True)
            file = models.FileField(_('File'), upload_to='data/files')
            publish = models.BooleanField(_('Publish'))
    
            def __unicode__(self):
                return self.name
    

    【讨论】:

      【解决方案3】:

      简短回答:不。

      http://docs.djangoproject.com/en/dev/topics/db/models/#field-name-hiding-is-not-permitted

      长答案:视情况而定。

      例如,您可以覆盖 init 和 save() 方法以在字段中放入一些默认值(例如,anonymous@example.com,根据定义为假的地址),您将然后在代码中管理该案例。

      【讨论】:

        【解决方案4】:

        Since Django 1.10 您可以覆盖抽象字段(即抽象基础模型的字段)。

        不允许“隐藏”字段名称

        [...]

        此限制不适用于从抽象模型继承的模型字段。这些字段可能会被另一个字段或值覆盖,或者通过设置field_name = None 来删除。

        因此,您为希望模型的方式提供的代码自 Django 1.10 起有效。

        【讨论】:

          猜你喜欢
          • 2011-08-05
          • 1970-01-01
          • 1970-01-01
          • 2019-12-26
          • 1970-01-01
          • 2016-09-11
          • 2018-08-23
          • 1970-01-01
          • 2016-04-15
          相关资源
          最近更新 更多