2014-05-21 63 views
5

哪個選項最好,1或2?默認模型字段應該由表單還是模型設置?

1.

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() 

或2

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) 
+0

也許有人有更多的知識可以編輯這個問題的標題,以反映問題。這有點模棱兩可,似乎並沒有反映這個問題。 – Deepend

+0

我更新主題名稱 – user1624522

回答

0

這取決於。如果這應該應用於每個模型,那麼在模型中更好。它會向你保證,每個Topic對象都將具有正確的值,即使是從管理界面編輯的對象也是如此。

該表格應該僅用於檢查來自用戶的數據,並且該模型適用於自動化此類任務(在保存對象之前生成數據)。請注意,這不應引發異常或使數據無效。

0

我個人更喜歡第二種選擇。模型也應該定義業務邏輯,而表單應該只處理用戶I/O。這樣,即使以編程方式使用(從其他代碼導入和調用),您的應用程序也會保持一致。

4

的區別在於,而第二被施加每當模型保存(儘管這仍然是在其中數據庫中的行可以在修改的所有方式的子集的第一版本僅通過形式修改對象時施加Django的)。即使你目前只是通過表單創建對象,我認爲它仍然是一個有用的區別要記住。

它看起來對我來說,這兩者的混合物,使你的情況感。一個slug的東西,你總是會想事先設定name - 也就是說,它的固有模式本身。另一方面,client_ip的想法似乎無情地與通過Web請求創建具有表單的對象的概念相關聯。

當然,你更好地瞭解這種模式的具體細節,但是這是我會接近問題的一般方法。

0

你不應該使用2.它能夠更好地使用等的信號預存或後保存

來源:https://docs.djangoproject.com/en/dev/topics/signals/

@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)