Django 默认模型字段是由表单还是模型设置的?
哪种选择最好,1还是2 一, 或2Django 默认模型字段是由表单还是模型设置的?,django,forms,models,Django,Forms,Models,哪种选择最好,1还是2 一, 或2 视情况而定。如果这适用于所有模型,那么在模型中效果更好。它将确保每个主题对象都有正确的值,即使是从管理界面编辑的值 表单应仅用于检查来自用户的数据,并且模型适合于自动化此类任务(在保存对象之前生成数据)。请小心,这不应引发异常或使数据无效。我个人更喜欢第二种选择。模型也应该定义业务逻辑,而表单应该只处理用户I/O。这样,即使以编程方式使用(从其他代码导入和调用),应用程序也会保持一致。区别在于,第一个版本仅在通过表单修改对象时应用,而第二种方法在保存模型时应用
视情况而定。如果这适用于所有模型,那么在模型中效果更好。它将确保每个
主题
对象都有正确的值,即使是从管理界面编辑的值
表单应仅用于检查来自用户的数据,并且模型适合于自动化此类任务(在保存对象之前生成数据)。请小心,这不应引发异常或使数据无效。我个人更喜欢第二种选择。模型也应该定义业务逻辑,而表单应该只处理用户I/O。这样,即使以编程方式使用(从其他代码导入和调用),应用程序也会保持一致。区别在于,第一个版本仅在通过表单修改对象时应用,而第二种方法在保存模型时应用(尽管这仍然是Django中修改数据库行的所有方法的子集)。即使您目前只通过表单创建对象,我认为这仍然是一个需要记住的有用区别 在我看来,在你的情况下,两者的结合是有道理的。
slug
是您始终希望基于name
设置的东西-也就是说,它是模型本身固有的。另一方面,client\u ip
的概念似乎与通过web请求创建具有表单的对象的概念紧密相连
当然,您可以更好地了解此模型的细节,但这是我处理问题的一般方法。您不应该使用2。最好使用诸如预保存或后保存之类的信号 资料来源:
也许有更多知识的人可以编辑此问题标题以反映问题。这有点模棱两可,似乎反映了这个问题。
class TopicForm(forms.Form):
name = forms.CharField(required=True)
body = RichTextFormField(required=True)
def save(self, request):
t = models.Topic(user=request.user,
site=get_current_site(request),
name=self.cleaned_data['name'],
body=self.cleaned_data['body'])
t.slug = slugify(self.name)
t.body_html = seo.nofollow(seo.noindex(self.body))
t.ip = utils.get_client_ip(request)
t.save()
class Topic(models.Model):
...
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
self.body_html = seo.nofollow(seo.noindex(self.body))
self.ip = utils.get_client_ip(request)
super(Topic, self).save(*args, **kwargs)
@receiver(pre_save, sender=Topic)
def topic_pre_save_handler(sender, instance, **kwargs):
instance.slug = slugify(self.name)
instance.body_html = seo.nofollow(seo.noindex(self.body))
instance.ip = utils.get_client_ip(request)