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

4 投票
4 回答
6762 浏览
提问于 2025-04-16 10:56

我正在创建一个需要评论系统的应用程序。我决定使用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 字段。听起来你也需要重写这个部分。

撰写回答