Python 从基抽象类Django的子类中移除字段
我正在创建一个需要评论系统的应用程序。我决定使用Django的评论应用程序,但需要稍微修改一下。首先,我不希望用户的电子邮件id是强制性的,接下来我需要一个选项来附加一个带有注释的文件 因此,我决定从BaseComentAbstractModel中创建子类。现在我需要覆盖用户的电子邮件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
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'),但这不起作用。