从基本抽象类Django的子类中删除字段

时间:2011-01-31 05:37:32

标签: python django base-class

我正在创建一个需要评论系统的应用程序。我决定使用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仍然是必需的。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

您确定问题与模型有关吗? BaseCommentAbstractModel甚至没有定义user_email,仅在主Comment模型中定义 - 并且在任何情况下都定义为blank=True

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

答案 1 :(得分:1)

只需在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

答案 2 :(得分:0)

简答:不。

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

答案很长:这取决于。

例如,您可以覆盖 init 和save()方法,在字段中添加一些默认值(例如anonymous@example.com,根据定义是假的地址),你会然后用代码管理那个案例。

答案 3 :(得分:0)

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

  

不允许使用字段名称“隐藏”

     

[...]

     

此限制不适用于从抽象模型继承的模型字段。此类字段可以被其他字段或值覆盖,也可以通过设置field_name = None来删除。

因此,从Django 1.10开始,您为模型所需的方式提供的代码就是有效的。