4

我正在创建一个需要评论系统的应用程序。我决定使用 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 仍然是强制性的。有任何想法吗?

4

4 回答 4

2

您确定问题与模型有关吗?BaseCommentAbstractModel甚至没有定义user_email,那只是在主模型中 -无论如何Comment它都被定义了。blank=True

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

于 2011-01-31T10:32:53.597 回答
2

从 Django 1.10开始,您可以覆盖抽象字段(即抽象基础模型的字段)。

不允许字段名称“隐藏”

[...]

此限制不适用于从抽象模型继承的模型字段。此类字段可能会被另一个字段或值覆盖,或者通过设置删除field_name = None

因此,您为希望模型的方式提供的代码自 Django 1.10 起就有效。

于 2019-01-25T11:27:07.167 回答
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
于 2011-01-31T10:39:44.103 回答
0

简短的回答:没有。

http://docs.djangoproject.com/en/dev/topics/db/models/#field-name-hiding-is-not-permitted

长答案:这取决于。

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

于 2011-01-31T21:59:21.657 回答