从Django基类抽象类的子类中移除字段
我正在创建一个需要评论系统的应用程序。我决定使用Django的评论应用,但需要对它做一些修改。首先,我不想让用户的邮箱地址成为必填项,其次,我需要一个可以在评论中附加文件的选项。
因此,我决定从BaseCommentAbstractModel这个基础模型进行扩展。现在我需要重写用户邮箱的部分,变成
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')
但是这样做不行,用户邮箱仍然是必填的。有没有什么想法?
4 个回答
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
从Django 1.10开始,你可以重写抽象字段(也就是抽象基类模型中的字段)。
字段名称“隐藏”是不允许的
[...]
这个限制不适用于从抽象模型继承的模型字段。这样的字段可以用其他字段或值来重写,或者通过设置
field_name = None
来移除。
所以你提供的代码,按照你想要的模型方式是有效的,因为从Django 1.10开始就可以这样做。
2
你确定问题跟模型有关吗?BaseCommentAbstractModel
里根本没有定义 user_email
,这个字段只在主 Comment
模型里有,而且在任何情况下它都是定义为 blank=True
的。
我觉得你更可能需要提供一个自定义的表单。主 CommentDetailsForm
不是一个模型表单,它是手动定义字段的,包括一个必填的 email
字段。听起来你也需要重写这个部分。