Python Django使用Author自动保存模型

Python Django使用Author自动保存模型,python,django,django-authentication,Python,Django,Django Authentication,Django 1.6具有模型和自定义用户 在场景中 AUTH_USER_MODEL = 'magazine.Author' models.py # -*-coding: utf-8 -*- from django.db import models import re import pytils import datetime from sorl.thumbnail import default import markdown from django.utils.encoding import

Django 1.6具有模型和自定义用户

在场景中

AUTH_USER_MODEL = 'magazine.Author'
models.py

# -*-coding: utf-8 -*-
from django.db import models
import re
import pytils
import datetime
from sorl.thumbnail import default
import markdown
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
from sorl.thumbnail import ImageField
from django.conf import settings

LANDSCAPE_THUMBS_SIZE = '1200x600'
SQUARE_THUMBS_SIZE = '800x800'
PORTRAIT_THUMBS_SIZE = '800x1200'

"""
some functions heed to content processing
"""
def mark(value):
    extensions = ["nl2br", ]
    return mark_safe(markdown.markdown(force_unicode(value), extensions, safe_mode=True, enable_attributes=False))

def get_image(content, thumbs, crop=None):
    try:
        firstImage = re.findall(r'(?mu)\[(?P<title>.*)\s*\]\((?P<url>.*)\s*\)', content)
        title = firstImage[0][0]
        url = firstImage[0][1]
        if crop:
            thumb = default.backend.get_thumbnail(firstImage[0][1], thumbs, crop=crop)
        else:
            thumb = default.backend.get_thumbnail(firstImage[0][1], thumbs)
        return { 'url' : thumb.url, 'title': title }
    except:
        return None


"""
Users
"""
class AuthorManager(BaseUserManager):
    def create_user(self, email, password=None):
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=AuthorManager.normalize_email(email),
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password):
        user = self.create_user(email,
            password=password,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user

class Author(AbstractBaseUser):
    email = models.EmailField(max_length=254, unique=True, db_index=True)

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

    def __unicode__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    objects = AuthorManager()

    @property
    def is_staff(self):
        return self.is_admin

"""
Articles classes
"""

class Category(models.Model):
    title = models.CharField(max_length=300, help_text="Заголовок")
    slug = models.SlugField(unique=True, help_text="Ссылка")

    def get_absolute_url(self):
        return '/category/%s/' % self.slug

    def __unicode__(self):
        return self.title

    class Meta:
        ordering = ['title']
        verbose_name_plural = "Категория"

    def save(self, *args, **kwargs):
        self.slug = pytils.translit.slugify(self.title)
        super(Category, self).save(*args, **kwargs)


class Post(models.Model):

    title = models.CharField(u'Имя', max_length=500, help_text=u'Мелкие')
    slug = models.SlugField(unique=True, help_text="Ссылка")
    content = models.TextField(u'Описание', help_text=u'Колье, серебро, большой текст.. Markdown', blank=True) 
    date = models.DateTimeField('Дата', default=datetime.datetime.now)
    category = models.ForeignKey('Category', related_name="category")
    tags = models.CharField(u'Тэги', max_length=500, help_text=u'Разделенные ","', blank=True)

    TYPE_OF_POST = (
        ('story', 'История'),
        ('interview', 'Беседа'),
        ('photo', 'Фото'),
    )
    type_post = models.CharField("Тип Записи", max_length=20, default='interview', choices=TYPE_OF_POST)
    author = models.ForeignKey(settings.AUTH_USER_MODEL)

    # standart
    def get_image_landscape(self):
        return get_image(self.content, LANDSCAPE_THUMBS_SIZE, crop='center')

    # standart
    def get_image_portrait(self):
        return get_image(self.content, PORTRAIT_THUMBS_SIZE, crop='center')

    # index small
    def get_image_square(self):
        return get_image(self.content, SQUARE_THUMBS_SIZE, crop='center')

    # content
    def get_content(self):
        return mark(self.content)

    # main preview
    def get_preview(self):
        content = re.sub(r'!(?mu)\[(?P<title>.*)\s*\]\((?P<url>.*)\s*\)', r'', self.content)
        if len(content.split('\n')) > 2:
            return mark(content.split('\n')[0])
        else:
            return mark(content)

    def get_tags(self):
        tags = re.split(", ", self.tags)
        tags_list = [dict(zip(("name", "url"), (i, pytils.translit.slugify(i)))) for i in tags]
        return tags_list

    def get_description(self):
        if '!more' in self.post:
            post = self.post.replace('!more', '<!--more-->')
            more = u'<div class="post_more"><a href="/%s/">Подробности..</a></div>' % self.slug
            a = post.split("<!--more-->")
            a.insert(1, more)
            return a[0] + a[1]
        else:
            return self.post

    def get_absolute_url(self):
        return '/%s/' % self.slug

    def __unicode__(self):
        return self.title

    class Meta:
        ordering = ['-date']
        verbose_name_plural = "Запись"
        unique_together = ('title', 'content')

    def save(self, *args, **kwargs):
        self.slug = pytils.translit.slugify(self.title)
        super(Post, self).save(*args, **kwargs)
但当我尝试保存模型时,我得到了一个错误

magazine_post.author_id may not be NULL
我试着这样做

但结果是相同的错误..:(

&full trace

您的问题是:

class PostAdmin(admin.ModelAdmin):
    ...
没有
author
作为字段,并且它是必需的字段

现在,当您从管理员保存模型时,
author
字段为
NULL
,根据数据库,它不可为NULL。因此出现错误


现在,要解决这个问题,请在
Post
admin

中添加
author
作为一个字段来解决这个问题–

这很糟糕,author,任何作者都不能更改author字段..甚至不能查看它们。管理员部分只能由受信任的个人访问。因此这很好。如果这不是你想要的,就必须覆盖它用于在后台填充此字段的保存方法
class PostAdmin(admin.ModelAdmin):
    ...