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 -->
我知道标题令人困惑,但让我解释一下。我目前正在为 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 -->