Django 管理表单错误,即使存在也从不保存外键

Django admin form error, never saves foreign key even if present

我知道标题令人困惑,但让我解释一下。我目前正在为 django + django-cms 项目实现一个小型 wiki apphook。我正在尝试向 wiki 添加部分,wiki 页面可以存在的地方是允许一些结构的特定部分。

这是我的 model.py:

from django.db import models
from djangocms_text_ckeditor.fields import HTMLField

class WikiPage(models.Model):
    slug = models.SlugField(max_length=50,primary_key=True)
    name = models.CharField(max_length=50)
    content = HTMLField(blank=True)
    section = models.ForeignKey('WikiSection', related_name='pages', db_index=True)

    def __str__(self):
        return self.name


class WikiSection(models.Model):
    slug = models.SlugField(max_length=50, primary_key=True)
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name

这是我的 admin.py:

from django.contrib import admin
from .models import WikiPage, WikiSection
from django import forms
from forms import WikiPageForm, WikiSectionForm

class WikiPageAdmin(admin.ModelAdmin):
    form = WikiPageForm

admin.site.register(WikiPage, WikiPageAdmin)

class WikiSectionAdmin(admin.ModelAdmin):
    form = WikiSectionForm

admin.site.register(WikiSection, WikiSectionAdmin)

忽略可怕的导入,我知道。

这是我的 forms.py:

from django import forms
from .models import WikiPage, WikiSection

class WikiPageForm(forms.ModelForm):
    class Meta:
        model = WikiPage
        exclude = ['slug']

    def clean(self):
        cleaned_data = super(WikiPageForm, self).clean()
        print cleaned_data



class WikiSectionForm(forms.ModelForm):
    class Meta:
        model = WikiSection
        exclude = ['slug']

现在,当我尝试填写该字段并保存管理表单时,它总是告诉我必须填写部分字段,即使我填写了该字段。我还意识到该字段不存在于 clean() 方法中。这是它打印的内容:

{'content': u'<p>sdfsdf</p>\r\n', 'name': u'fdfsdf'}

编辑: 我还检查了 POST

中未发送数据

哇,我犯了这么愚蠢的错误。由于我从两个模型中排除了 slug 字段,因此我需要重写 save 方法并为对象提供一个 slug 字段。这是我修改后的 models.py:

from django.db import models
from django.utils.text import slugify
from djangocms_text_ckeditor.fields import HTMLField

class WikiPage(models.Model):
    slug = models.SlugField(max_length=50,primary_key=True)
    name = models.CharField(max_length=50)
    content = HTMLField(blank=True)
    section = models.ForeignKey('WikiSection', related_name='pages', db_index=True)

    def __str__(self):
        return self.name

    <!-- ADDED THIS -->
    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(WikiPage, self).save(*args, **kwargs)
    <!-- ADDED THIS -->


class WikiSection(models.Model):
    slug = models.SlugField(max_length=50, primary_key=True)
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


    <!-- AND THIS -->
    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(WikiSection, self).save(*args, **kwargs)
    <!-- AND THIS -->