我正在创建一个需要评论系统的应用程序。我决定使用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仍然是必需的。有什么想法吗?
答案 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开始,您为模型所需的方式提供的代码就是有效的。