Django 默认模型字段是由表单还是模型设置的?

Django 默认模型字段是由表单还是模型设置的?,django,forms,models,Django,Forms,Models,哪种选择最好,1还是2 一, 或2 视情况而定。如果这适用于所有模型,那么在模型中效果更好。它将确保每个主题对象都有正确的值,即使是从管理界面编辑的值 表单应仅用于检查来自用户的数据,并且模型适合于自动化此类任务(在保存对象之前生成数据)。请小心,这不应引发异常或使数据无效。我个人更喜欢第二种选择。模型也应该定义业务逻辑,而表单应该只处理用户I/O。这样,即使以编程方式使用(从其他代码导入和调用),应用程序也会保持一致。区别在于,第一个版本仅在通过表单修改对象时应用,而第二种方法在保存模型时应用

哪种选择最好,1还是2

一,

或2


视情况而定。如果这适用于所有模型,那么在模型中效果更好。它将确保每个
主题
对象都有正确的值,即使是从管理界面编辑的值


表单应仅用于检查来自用户的数据,并且模型适合于自动化此类任务(在保存对象之前生成数据)。请小心,这不应引发异常或使数据无效。

我个人更喜欢第二种选择。模型也应该定义业务逻辑,而表单应该只处理用户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)