Python 从基抽象类Django的子类中移除字段

Python 从基抽象类Django的子类中移除字段,python,django,base-class,Python,Django,Base Class,我正在创建一个需要评论系统的应用程序。我决定使用Django的评论应用程序,但需要稍微修改一下。首先,我不希望用户的电子邮件id是强制性的,接下来我需要一个选项来附加一个带有注释的文件 因此,我决定从BaseComentAbstractModel中创建子类。现在我需要覆盖用户的电子邮件 user_email= models.EmailField(max_length=100, blank=True) 并添加另一个字段 file = models.FileField(upload_to='dat

我正在创建一个需要评论系统的应用程序。我决定使用Django的评论应用程序,但需要稍微修改一下。首先,我不希望用户的电子邮件id是强制性的,接下来我需要一个选项来附加一个带有注释的文件

因此,我决定从BaseComentAbstractModel中创建子类。现在我需要覆盖用户的电子邮件

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')

但这是行不通的。用户电子邮件仍然是必需的。有什么想法吗?

你确定问题与模型有关吗
BaseComentAbstractModel
甚至没有定义
user\u email
,这只是在主
Comment
模型中,并且在任何情况下都被定义为
blank=True


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

只需在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
简短回答:没有

详细回答:这要看情况

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

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

不允许字段名“隐藏” [……]

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


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

谢谢,我将尝试创建一个表单。但让我们假设我继承了评论。有可能改变吗?通过谷歌搜索,我发现在.96版本中有一个名为META的类,我可以添加remove_field=('user_name'),但这不起作用。