Python Django:如何基于表单的非持久字段自定义保存模型/表单?
自从我在以前的帖子中1次问了2个问题后,我重新发布了这个问题 当布尔值to\u publish设置为true时,我想将条目模型中的字段publication\u date设置为true,类似于模型中的custom save()方法,但我无法在表单上执行此操作Python Django:如何基于表单的非持久字段自定义保存模型/表单?,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,自从我在以前的帖子中1次问了2个问题后,我重新发布了这个问题 当布尔值to\u publish设置为true时,我想将条目模型中的字段publication\u date设置为true,类似于模型中的custom save()方法,但我无法在表单上执行此操作 #blog/models.py class Entry(models.Model): title = models.CharField(max_length=100) body = models.TextField()
#blog/models.py
class Entry(models.Model):
title = models.CharField(max_length=100)
body = models.TextField()
slug = models.SlugField(max_length=100, unique=True)
creation_date = models.DateTimeField(editable=False)
publication_date = models.DateTimeField(editable=False, null=True)
modification_date = models.DateTimeField(editable=False)
author = models.ForeignKey(User)
categories = models.ManyToManyField(Category)
tags = models.ManyToManyField(Tag)
objects = EntryQuerySet.as_manager()
def __str__(self):
return self.title
def was_published_recently(self):
now = datetime.datetime.now()
return now - datetime.timedelta(days=1) <= self.publication_date <= now
def is_published(self):
return self.publication_date is not False
is_published.boolean = True
is_published.short_description = 'Is it Published?'
def get_absolute_url(self):
return reverse("entry_detail", kwargs={"slug": self.slug})
class Meta():
verbose_name = "Blog Entry"
verbose_name_plural = "Blog Entries"
ordering = ['-creation_date']
def save(self, *args, **kwargs):
""" On save, update timestamps """
if not self.id:
self.creation_date = datetime.datetime.now()
self.modification_date = datetime.datetime.now()
return super(Entry, self).save(*args, **kwargs)
#blog/forms.py
class EntryAdminForm(forms.ModelForm):
to_publish = forms.BooleanField(required=False)
class Meta:
model = Entry
fields = ['title', 'body', 'slug', 'author', 'categories', 'tags']
#blog/admin.py
class EntryAdmin(MarkdownModelAdmin):
form = EntryAdminForm
list_display = ("title", "author", "creation_date", "publication_date", "is_published")
prepopulated_fields = {"slug": ("title",)}
formfield_overrides = {TextField: {'widget': AdminMarkdownWidget}}
#blog/models.py
类条目(models.Model):
title=models.CharField(最大长度=100)
body=models.TextField()
slug=models.SlugField(最大长度=100,唯一性=True)
创建日期=模型.DateTimeField(可编辑=假)
publication_date=models.DateTimeField(可编辑=False,null=True)
修改日期=模型.DateTimeField(可编辑=假)
author=models.ForeignKey(用户)
类别=模型。多个多个字段(类别)
标记=型号。ManyToManyField(标记)
objects=EntryQuerySet.as_manager()
定义(自我):
返回自己的标题
def最近发布(自我):
now=datetime.datetime.now()
立即返回-datetime.timedelta(days=1)覆盖EntryAdmin的save\u model()
方法:
class EntryAdmin(MarkdownModelAdmin):
...
def save_model(self, request, obj, form, change):
if form.cleaned_data.get('to_publish'):
obj.publication_date = datetime.now()
obj.save()
另一个(也是更复杂的)选项是重写EntryAdminForm.save()
方法:
class EntryAdminForm(forms.ModelForm):
....
def save(self, *args, **kwargs):
entry = super(EntryAdminForm, self).save(*args, **kwargs)
if self.cleaned_data.get('to_publish'):
entry.publication_date = datetime.now()
if kwargs.get('commit', True):
entry.save()
return entry
另一个选项是重写EntryAdminForm.save()
,但在ModelAdmin.save\u model()
中执行它会更简短、更简洁。这就是我试图执行的操作,但无法使其工作,我不太理解save()参数。您可能对admin感兴趣的唯一参数是commit
。我对答案进行了编辑,以说明如何做到这一点。