Удалить поле из подкласса базового абстрактного класса Django - PullRequest
3 голосов
/ 31 января 2011

Я создаю приложение, которому нужна система комментирования.Я решил использовать приложение комментариев от Django, но мне нужно было немного его изменить.Сначала я не хочу, чтобы идентификатор электронной почты пользователя был обязательным, а затем мне нужна опция, чтобы прикрепить файл с комментарием.

Таким образом, я решил создать подкласс от 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 ]

2 голосов
/ 31 января 2011

Вы уверены, что проблема связана с моделью?BaseCommentAbstractModel даже не определяет user_email, это только в основной Comment модели - и оно определяется как blank=True в любом случае.

Я думаю, что более вероятно, что вам нужно предоставитьпользовательская форма.Основной CommentDetailsForm не является формой модели - он вручную определяет свои поля, включая обязательное поле email.Похоже, вам тоже нужно это переопределить.

1 голос
/ 31 января 2011

Просто создайте пользовательскую форму с помощью общих представлений 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
0 голосов
/ 25 января 2019

Начиная с Django 1.10 у вас есть возможность переопределять абстрактные поля (т. Е. Поля абстрактных базовых моделей).

Имя поля «скрывать» не допускается

[...]

Это ограничение не распространяется на поля модели, унаследованные от абстрактной модели.Такие поля могут быть переопределены с другим полем или значением, или могут быть удалены путем установки field_name = None.

Таким образом, код, который вы указали для того, как вы хотите, чтобы ваша модель была действительной, начиная с Django 1.10.

0 голосов
/ 01 февраля 2011

Краткий ответ: нет.

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

Длинный ответ: зависит.

Например, вы можете переписать методы init и save (), чтобы ввести в поле какое-либо значение по умолчанию (например, anonymous@example.com, адрес, который является поддельным по определению), и тогда управляйте этим делом в коде.

...