我正在开发一个小型django
应用,其中模型包含TextField
和PositiveIntegerField
。
我需要PositiveInegerField
填充TextField
中的字数。
这可以通过自定义javascript代码完成,该代码计算TextField文本区域中的单词数量,并在提交表单之前将值放入单词计数字段文本框但我不想在管理员中使用自定义javascript 。
如何以编程方式为PositiveIntegerField
分配值?
答案 0 :(得分:3)
这可以使用pre_save Signal来实现。
创建一个像这样的信号函数:
def calculate_wordcount(sender, instance, **kwargs):
# count the words...
instance.word_count = # your count from line above
然后将此功能附加到您的模型。自Django 1.7以来的首选方式是应用程序配置(请参阅doc)。
您可以在AppConfig
ready() - 方法
def ready(self):
pre_save.connect(calculate_wordcount,
sender= ,# your model
weak=False,
dispatch_uid='models.your_model.wordcount')
如果您需要进一步的指示,我会留下所有必要的进口产品,请发表评论!
答案 1 :(得分:1)
虽然一般来说我认为保存信号是一个合理的想法,在这种特殊情况下你也可以自己覆盖.save()
class MyClass(models.Model):
[stuff]
def save(self, *args, **kwargs):
self.wordcount = #something that calculates wordcount
super(self.myClass, self).save(*args, **kwargs) #Call django's save!
(根据经验,如果我只是对一个模型做事情,我会覆盖save()
,但如果我使用一个模型影响另一个模型,则使用信号这个想法是在代码中保留所有影响模型的东西。但这会进入个人哲学。
另请注意:无论您使用哪个版本,信号或覆盖save()
,bulk_create
和bulk_delete
都不会发送信号或调用您的特定save
功能。请参阅此处的文档:https://docs.djangoproject.com/en/1.8/topics/db/models/#overriding-predefined-model-methods